This commit is contained in:
Lana Steuck 2012-12-14 13:14:33 -08:00
commit 0118983407
393 changed files with 5507 additions and 1815 deletions

View File

@ -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::

View File

@ -0,0 +1,39 @@
#
# 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

View File

@ -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

View File

@ -38,10 +38,12 @@ SUBDIRS_MAKEFLAGS += JAVAC_MAX_WARNINGS=true
SUBDIRS_MAKEFLAGS += JAVAC_WARNINGS_FATAL=true SUBDIRS_MAKEFLAGS += JAVAC_WARNINGS_FATAL=true
include $(BUILDDIR)/common/Defs.gmk include $(BUILDDIR)/common/Defs.gmk
# build sun/security/jgss/wrapper on non-windows platform # build sun/security/jgss/wrapper on non-windows non-macosx platforms
JGSS_WRAPPER = JGSS_WRAPPER =
ifneq ($(PLATFORM), windows) ifneq ($(PLATFORM), windows)
JGSS_WRAPPER = jgss/wrapper ifneq ($(PLATFORM), macosx)
JGSS_WRAPPER = jgss/wrapper
endif
endif endif
# Build PKCS#11 on all platforms # Build PKCS#11 on all platforms

View File

@ -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 {
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 {
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 {
// 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 {
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 {
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 {
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 {
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;
}
} }

View File

@ -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;
} }

View File

@ -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 {
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 {
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 {
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 {
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 {
// 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 {
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 {
} }
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 {
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 {
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 {
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) {

View File

@ -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> {
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,25 +225,36 @@ 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
switch (attributes.getValue("type")) { if (attributes.getValue("alt") == null) {
case "am": switch (attributes.getValue("type")) {
pushStringArrayElement(qName, attributes, 0); case "am":
break; pushStringArrayElement(qName, attributes, 0);
case "pm": break;
pushStringArrayElement(qName, attributes, 1); case "pm":
break; pushStringArrayElement(qName, attributes, 1);
default: break;
default:
pushIgnoredContainer(qName);
break;
}
} else {
// discard alt values
pushIgnoredContainer(qName); pushIgnoredContainer(qName);
break;
} }
break; break;
case "eraNames": case "eraNames":
@ -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> {
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> {
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
case "daylight": // daylight saving (summer) time name
pushStringEntry(qName, attributes, CLDRConverter.ZONE_NAME_PREFIX + qName + "." + zoneNameStyle);
break; break;
case "standard": // standard time case "exemplarCity": // not used in JDK
pushStringEntry(qName, attributes, CLDRConverter.TIMEZONE_NAME_PREFIX + "standard." + zoneNameStyle);
break;
case "daylight":
pushStringEntry(qName, attributes, CLDRConverter.TIMEZONE_NAME_PREFIX + "daylight." + zoneNameStyle);
break;
case "exemplarCity":
pushIgnoredContainer(qName); pushIgnoredContainer(qName);
break; break;
@ -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)) {

View File

@ -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":

View File

@ -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 {
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 {
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 {
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[] {");

View File

@ -2540,6 +2540,7 @@ BUILD_LIBRARIES += $(BUILD_LIBJ2PCSC)
########################################################################################## ##########################################################################################
ifneq ($(OPENJDK_TARGET_OS), windows) ifneq ($(OPENJDK_TARGET_OS), windows)
ifneq ($(OPENJDK_TARGET_OS), macosx)
$(eval $(call SetupNativeCompilation,BUILD_LIBJ2GSS,\ $(eval $(call SetupNativeCompilation,BUILD_LIBJ2GSS,\
LIBRARY:=j2gss,\ LIBRARY:=j2gss,\
OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\ OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\
@ -2559,6 +2560,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJ2GSS,\
BUILD_LIBRARIES += $(BUILD_LIBJ2GSS) BUILD_LIBRARIES += $(BUILD_LIBJ2GSS)
endif endif
endif
########################################################################################## ##########################################################################################

View File

@ -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) $@

View File

@ -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;
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> {
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);
}
}
}
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 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
@ -53,12 +53,13 @@ public class KeyManagerFactory {
/** /**
* <p>The default KeyManager can be changed by setting the value of the * <p>The default KeyManager can be changed by setting the value of the
* "sun.ssl.keymanager.type" security property (in the Java security * {@code sun.ssl.keymanager.type} security property to the desired name.
* properties file) to the desired name.
* *
* @return the default type as specified in the * @return the default type as specified by the
* Java security properties file, or an implementation-specific default * {@code sun.ssl.keymanager.type} security property, or an
* if no such property exists. * implementation-specific default if no such property exists.
*
* @see java.security.Security security properties
*/ */
public final static String getDefaultAlgorithm() { public final static String getDefaultAlgorithm() {
String type; String type;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 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
@ -53,12 +53,13 @@ public class TrustManagerFactory {
/** /**
* <p>The default TrustManager can be changed by setting the value of the * <p>The default TrustManager can be changed by setting the value of the
* "sun.ssl.trustmanager.type" security property * {@code sun.ssl.trustmanager.type} security property to the desired name.
* (in the Java security properties file) to the desired name.
* *
* @return the default type as specified in the * @return the default type as specified by the
* Java security properties file, or an implementation-specific default * {@code sun.ssl.trustmanager.type} security property, or an
* if no such property exists. * implementation-specific default if no such property exists.
*
* @see java.security.Security security properties
*/ */
public final static String getDefaultAlgorithm() { public final static String getDefaultAlgorithm() {
String type; String type;

View File

@ -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 {
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 {
// 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 {
} }
} 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 {
// 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();

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 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
@ -59,13 +59,9 @@ import sun.security.util.PropertyExpander;
* *
* <ol> * <ol>
* <li> * <li>
* Loop through the <code>java.security.Security</code> properties, * Loop through the security properties,
* <i>auth.policy.url.1</i>, <i>auth.policy.url.2</i>, ..., * <i>auth.policy.url.1</i>, <i>auth.policy.url.2</i>, ...,
* <i>auth.policy.url.X</i>". These properties are set * <i>auth.policy.url.X</i>".
* in the Java security properties file, which is located in the file named
* &lt;JAVA_HOME&gt;/lib/security/java.security.
* &lt;JAVA_HOME&gt; refers to the value of the java.home system property,
* and specifies the directory where the JRE is installed.
* Each property value specifies a <code>URL</code> pointing to a * Each property value specifies a <code>URL</code> pointing to a
* policy file to be loaded. Read in and load each policy. * policy file to be loaded. Read in and load each policy.
* *
@ -235,6 +231,7 @@ import sun.security.util.PropertyExpander;
* @see java.security.CodeSource * @see java.security.CodeSource
* @see java.security.Permissions * @see java.security.Permissions
* @see java.security.ProtectionDomain * @see java.security.ProtectionDomain
* @see java.security.Security security properties
*/ */
@Deprecated @Deprecated
public class PolicyFile extends javax.security.auth.Policy { public class PolicyFile extends javax.security.auth.Policy {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 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
@ -49,13 +49,9 @@ import sun.security.util.PropertyExpander;
* *
* <ol> * <ol>
* <li> * <li>
* Loop through the <code>java.security.Security</code> properties, * Loop through the security properties,
* <i>login.config.url.1</i>, <i>login.config.url.2</i>, ..., * <i>login.config.url.1</i>, <i>login.config.url.2</i>, ...,
* <i>login.config.url.X</i>. These properties are set * <i>login.config.url.X</i>.
* in the Java security properties file, which is located in the file named
* &lt;JAVA_HOME&gt;/lib/security/java.security.
* &lt;JAVA_HOME&gt; refers to the value of the java.home system property,
* and specifies the directory where the JRE is installed.
* Each property value specifies a <code>URL</code> pointing to a * Each property value specifies a <code>URL</code> pointing to a
* login configuration file to be loaded. Read in and load * login configuration file to be loaded. Read in and load
* each configuration. * each configuration.
@ -87,6 +83,7 @@ import sun.security.util.PropertyExpander;
* <code>javax.security.auth.login.Configuration</code> class. * <code>javax.security.auth.login.Configuration</code> class.
* *
* @see javax.security.auth.login.LoginContext * @see javax.security.auth.login.LoginContext
* @see java.security.Security security properties
*/ */
public class ConfigFile extends javax.security.auth.login.Configuration { public class ConfigFile extends javax.security.auth.login.Configuration {

View File

@ -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;

View File

@ -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;
* } * }
* </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> {
* 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> {
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> {
* 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> {
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> {
* @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

View File

@ -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;
* *
* @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;
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;
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;
*/ */
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);

View File

@ -30,6 +30,8 @@ import java.util.StringTokenizer;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
@ -89,7 +91,10 @@ public final class HttpCookie implements Cloneable {
private final static String[] COOKIE_DATE_FORMATS = { private final static String[] COOKIE_DATE_FORMATS = {
"EEE',' dd-MMM-yyyy HH:mm:ss 'GMT'", "EEE',' dd-MMM-yyyy HH:mm:ss 'GMT'",
"EEE',' dd MMM yyyy HH:mm:ss 'GMT'", "EEE',' dd MMM yyyy HH:mm:ss 'GMT'",
"EEE MMM dd yyyy HH:mm:ss 'GMT'Z" "EEE MMM dd yyyy HH:mm:ss 'GMT'Z",
"EEE',' dd-MMM-yy HH:mm:ss 'GMT'",
"EEE',' dd MMM yy HH:mm:ss 'GMT'",
"EEE MMM dd yy HH:mm:ss 'GMT'Z"
}; };
// constant strings represent set-cookie header token // constant strings represent set-cookie header token
@ -1025,13 +1030,29 @@ public final class HttpCookie implements Cloneable {
* specified by dateString * specified by dateString
*/ */
private long expiryDate2DeltaSeconds(String dateString) { private long expiryDate2DeltaSeconds(String dateString) {
Calendar cal = new GregorianCalendar(GMT);
for (int i = 0; i < COOKIE_DATE_FORMATS.length; i++) { for (int i = 0; i < COOKIE_DATE_FORMATS.length; i++) {
SimpleDateFormat df = new SimpleDateFormat(COOKIE_DATE_FORMATS[i], SimpleDateFormat df = new SimpleDateFormat(COOKIE_DATE_FORMATS[i],
Locale.US); Locale.US);
cal.set(1970, 0, 1, 0, 0, 0);
df.setTimeZone(GMT); df.setTimeZone(GMT);
df.setLenient(false);
df.set2DigitYearStart(cal.getTime());
try { try {
Date date = df.parse(dateString); cal.setTime(df.parse(dateString));
return (date.getTime() - whenCreated) / 1000; if (!COOKIE_DATE_FORMATS[i].contains("yyyy")) {
// 2-digit years following the standard set
// out it rfc 6265
int year = cal.get(Calendar.YEAR);
year %= 100;
if (year < 70) {
year += 2000;
} else {
year += 1900;
}
cal.set(Calendar.YEAR, year);
}
return (cal.getTimeInMillis() - whenCreated) / 1000;
} catch (Exception e) { } catch (Exception e) {
// Ignore, try the next date format // Ignore, try the next date format
} }

View File

@ -25,9 +25,9 @@
package java.net; package java.net;
import java.io.ObjectInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InvalidObjectException; import java.io.InvalidObjectException;
import java.io.ObjectInputStream;
import java.util.Enumeration; import java.util.Enumeration;
/** /**
@ -116,7 +116,8 @@ import java.util.Enumeration;
* <h4> Special IPv6 address </h4> * <h4> Special IPv6 address </h4>
* *
* <blockquote> * <blockquote>
* <table cellspacing=2 summary="Description of IPv4-mapped address"> <tr><th valign=top><i>IPv4-mapped address</i></th> * <table cellspacing=2 summary="Description of IPv4-mapped address">
* <tr><th valign=top><i>IPv4-mapped address</i></th>
* <td>Of the form::ffff:w.x.y.z, this IPv6 address is used to * <td>Of the form::ffff:w.x.y.z, this IPv6 address is used to
* represent an IPv4 address. It allows the native program to * represent an IPv4 address. It allows the native program to
* use the same address data structure and also the same * use the same address data structure and also the same
@ -130,35 +131,40 @@ import java.util.Enumeration;
* address.</td></tr> * address.</td></tr>
* </table></blockquote> * </table></blockquote>
* <p> * <p>
* <h4> <A NAME="scoped">Textual representation of IPv6 scoped addresses</a> </h4> * <h4><A NAME="scoped">Textual representation of IPv6 scoped addresses</a></h4>
* <p> *
* The textual representation of IPv6 addresses as described above can be extended * <p> The textual representation of IPv6 addresses as described above can be
* to specify IPv6 scoped addresses. This extension to the basic addressing architecture * extended to specify IPv6 scoped addresses. This extension to the basic
* is described in [draft-ietf-ipngwg-scoping-arch-04.txt]. * addressing architecture is described in [draft-ietf-ipngwg-scoping-arch-04.txt].
* <p> *
* Because link-local and site-local addresses are non-global, it is possible that different hosts * <p> Because link-local and site-local addresses are non-global, it is possible
* may have the same destination address and may be reachable through different interfaces on the * that different hosts may have the same destination address and may be
* same originating system. In this case, the originating system is said to be connected * reachable through different interfaces on the same originating system. In
* to multiple zones of the same scope. In order to disambiguate which is the intended destination * this case, the originating system is said to be connected to multiple zones
* zone, it is possible to append a zone identifier (or <i>scope_id</i>) to an IPv6 address. * of the same scope. In order to disambiguate which is the intended destination
* <p> * zone, it is possible to append a zone identifier (or <i>scope_id</i>) to an
* The general format for specifying the <i>scope_id</i> is the following: * IPv6 address.
*
* <p> The general format for specifying the <i>scope_id</i> is the following:
*
* <p><blockquote><i>IPv6-address</i>%<i>scope_id</i></blockquote> * <p><blockquote><i>IPv6-address</i>%<i>scope_id</i></blockquote>
* <p> The IPv6-address is a literal IPv6 address as described above. * <p> The IPv6-address is a literal IPv6 address as described above.
* The <i>scope_id</i> refers to an interface on the local system, and it can be specified * The <i>scope_id</i> refers to an interface on the local system, and it can be
* in two ways. * specified in two ways.
* <p><ol><li><i>As a numeric identifier.</i> This must be a positive integer that identifies the * <p><ol><li><i>As a numeric identifier.</i> This must be a positive integer
* particular interface and scope as understood by the system. Usually, the numeric * that identifies the particular interface and scope as understood by the
* values can be determined through administration tools on the system. Each interface may * system. Usually, the numeric values can be determined through administration
* have multiple values, one for each scope. If the scope is unspecified, then the default value * tools on the system. Each interface may have multiple values, one for each
* used is zero.</li><p> * scope. If the scope is unspecified, then the default value used is zero.</li>
* <li><i>As a string.</i> This must be the exact string that is returned by * <p><li><i>As a string.</i> This must be the exact string that is returned by
* {@link java.net.NetworkInterface#getName()} for the particular interface in question. * {@link java.net.NetworkInterface#getName()} for the particular interface in
* When an Inet6Address is created in this way, the numeric scope-id is determined at the time * question. When an Inet6Address is created in this way, the numeric scope-id
* the object is created by querying the relevant NetworkInterface.</li> * is determined at the time the object is created by querying the relevant
* </ol><p> * NetworkInterface.</li></ol>
* Note also, that the numeric <i>scope_id</i> can be retrieved from Inet6Address instances returned from the *
* NetworkInterface class. This can be used to find out the current scope ids configured on the system. * <p> Note also, that the numeric <i>scope_id</i> can be retrieved from
* Inet6Address instances returned from the NetworkInterface class. This can be
* used to find out the current scope ids configured on the system.
* @since 1.4 * @since 1.4
*/ */
@ -169,7 +175,7 @@ class Inet6Address extends InetAddress {
/* /*
* cached scope_id - for link-local address use only. * cached scope_id - for link-local address use only.
*/ */
private transient int cached_scope_id = 0; private transient int cached_scope_id; // 0
/** /**
* Holds a 128-bit (16 bytes) IPv6 address. * Holds a 128-bit (16 bytes) IPv6 address.
@ -179,37 +185,28 @@ class Inet6Address extends InetAddress {
byte[] ipaddress; byte[] ipaddress;
/** /**
* scope_id. The scope specified when the object is created. If the object is created * scope_id. The scope specified when the object is created. If the object
* with an interface name, then the scope_id is not determined until the time it is needed. * is created with an interface name, then the scope_id is not determined
* until the time it is needed.
*/ */
private int scope_id = 0; private int scope_id; // 0
/** /**
* This will be set to true when the scope_id field contains a valid * This will be set to true when the scope_id field contains a valid
* integer scope_id. * integer scope_id.
*/ */
private boolean scope_id_set = false; private boolean scope_id_set; // false
/** /**
* scoped interface. scope_id is derived from this as the scope_id of the first * scoped interface. scope_id is derived from this as the scope_id of the first
* address whose scope is the same as this address for the named interface. * address whose scope is the same as this address for the named interface.
*/ */
private transient NetworkInterface scope_ifname = null; private transient NetworkInterface scope_ifname; // null
/**
* set if the object is constructed with a scoped interface instead of a
* numeric scope id.
*/
private boolean scope_ifname_set = false;
private static final long serialVersionUID = 6880410070516793377L; private static final long serialVersionUID = 6880410070516793377L;
/* // Perform native initialization
* Perform initializations. static { init(); }
*/
static {
init();
}
Inet6Address() { Inet6Address() {
super(); super();
@ -239,19 +236,24 @@ class Inet6Address extends InetAddress {
} catch (UnknownHostException e) {} /* cant happen if ifname is null */ } catch (UnknownHostException e) {} /* cant happen if ifname is null */
} }
Inet6Address (String hostName, byte addr[], NetworkInterface nif) throws UnknownHostException { Inet6Address (String hostName, byte addr[], NetworkInterface nif)
throws UnknownHostException
{
initif (hostName, addr, nif); initif (hostName, addr, nif);
} }
Inet6Address (String hostName, byte addr[], String ifname) throws UnknownHostException { Inet6Address (String hostName, byte addr[], String ifname)
throws UnknownHostException
{
initstr (hostName, addr, ifname); initstr (hostName, addr, ifname);
} }
/** /**
* Create an Inet6Address in the exact manner of {@link InetAddress#getByAddress(String,byte[])} * Create an Inet6Address in the exact manner of {@link
* except that the IPv6 scope_id is set to the value corresponding to the given interface * InetAddress#getByAddress(String,byte[])} except that the IPv6 scope_id is
* for the address type specified in <code>addr</code>. * set to the value corresponding to the given interface for the address
* The call will fail with an UnknownHostException if the given interface does not have a numeric * type specified in <code>addr</code>. The call will fail with an
* UnknownHostException if the given interface does not have a numeric
* scope_id assigned for the given address type (eg. link-local or site-local). * scope_id assigned for the given address type (eg. link-local or site-local).
* See <a href="Inet6Address.html#scoped">here</a> for a description of IPv6 * See <a href="Inet6Address.html#scoped">here</a> for a description of IPv6
* scoped addresses. * scoped addresses.
@ -260,14 +262,16 @@ class Inet6Address extends InetAddress {
* @param addr the raw IP address in network byte order * @param addr the raw IP address in network byte order
* @param nif an interface this address must be associated with. * @param nif an interface this address must be associated with.
* @return an Inet6Address object created from the raw IP address. * @return an Inet6Address object created from the raw IP address.
* @exception UnknownHostException if IP address is of illegal length, or if the interface * @throws UnknownHostException
* does not have a numeric scope_id assigned for the given address type. * if IP address is of illegal length, or if the interface does not
* have a numeric scope_id assigned for the given address type.
* *
* @since 1.5 * @since 1.5
*/ */
public static Inet6Address getByAddress(String host, byte[] addr,
public static Inet6Address getByAddress(String host, byte[] addr, NetworkInterface nif) NetworkInterface nif)
throws UnknownHostException { throws UnknownHostException
{
if (host != null && host.length() > 0 && host.charAt(0) == '[') { if (host != null && host.length() > 0 && host.charAt(0) == '[') {
if (host.charAt(host.length()-1) == ']') { if (host.charAt(host.length()-1) == ']') {
host = host.substring(1, host.length() -1); host = host.substring(1, host.length() -1);
@ -282,9 +286,10 @@ class Inet6Address extends InetAddress {
} }
/** /**
* Create an Inet6Address in the exact manner of {@link InetAddress#getByAddress(String,byte[])} * Create an Inet6Address in the exact manner of {@link
* except that the IPv6 scope_id is set to the given numeric value. * InetAddress#getByAddress(String,byte[])} except that the IPv6 scope_id is
* The scope_id is not checked to determine if it corresponds to any interface on the system. * set to the given numeric value. The scope_id is not checked to determine
* if it corresponds to any interface on the system.
* See <a href="Inet6Address.html#scoped">here</a> for a description of IPv6 * See <a href="Inet6Address.html#scoped">here</a> for a description of IPv6
* scoped addresses. * scoped addresses.
* *
@ -292,13 +297,14 @@ class Inet6Address extends InetAddress {
* @param addr the raw IP address in network byte order * @param addr the raw IP address in network byte order
* @param scope_id the numeric scope_id for the address. * @param scope_id the numeric scope_id for the address.
* @return an Inet6Address object created from the raw IP address. * @return an Inet6Address object created from the raw IP address.
* @exception UnknownHostException if IP address is of illegal length. * @throws UnknownHostException if IP address is of illegal length.
* *
* @since 1.5 * @since 1.5
*/ */
public static Inet6Address getByAddress(String host, byte[] addr,
public static Inet6Address getByAddress(String host, byte[] addr, int scope_id) int scope_id)
throws UnknownHostException { throws UnknownHostException
{
if (host != null && host.length() > 0 && host.charAt(0) == '[') { if (host != null && host.length() > 0 && host.charAt(0) == '[') {
if (host.charAt(host.length()-1) == ']') { if (host.charAt(host.length()-1) == ']') {
host = host.substring(1, host.length() -1); host = host.substring(1, host.length() -1);
@ -312,7 +318,9 @@ class Inet6Address extends InetAddress {
throw new UnknownHostException("addr is of illegal length"); throw new UnknownHostException("addr is of illegal length");
} }
private void initstr (String hostName, byte addr[], String ifname) throws UnknownHostException { private void initstr(String hostName, byte addr[], String ifname)
throws UnknownHostException
{
try { try {
NetworkInterface nif = NetworkInterface.getByName (ifname); NetworkInterface nif = NetworkInterface.getByName (ifname);
if (nif == null) { if (nif == null) {
@ -324,16 +332,17 @@ class Inet6Address extends InetAddress {
} }
} }
private void initif(String hostName, byte addr[],NetworkInterface nif) throws UnknownHostException { private void initif(String hostName, byte addr[],NetworkInterface nif)
throws UnknownHostException
{
this.hostName = hostName; this.hostName = hostName;
if (addr.length == INADDRSZ) { // normal IPv6 address if (addr.length == INADDRSZ) { // normal IPv6 address
family = IPv6; family = IPv6;
ipaddress = addr.clone(); ipaddress = addr.clone();
} }
if (nif != null) { if (nif != null) {
this.scope_ifname = nif; scope_ifname = nif;
scope_ifname_set = true; scope_id = deriveNumericScope(nif);
scope_id = deriveNumericScope (nif);
scope_id_set = true; scope_id_set = true;
} }
} }
@ -344,17 +353,16 @@ class Inet6Address extends InetAddress {
* return true otherwise. * return true otherwise.
*/ */
private boolean differentLocalAddressTypes(Inet6Address other) { private boolean differentLocalAddressTypes(Inet6Address other) {
if (isLinkLocalAddress() && !other.isLinkLocalAddress())
if (isLinkLocalAddress() && !other.isLinkLocalAddress()) {
return false; return false;
} if (isSiteLocalAddress() && !other.isSiteLocalAddress())
if (isSiteLocalAddress() && !other.isSiteLocalAddress()) {
return false; return false;
}
return true; return true;
} }
private int deriveNumericScope (NetworkInterface ifc) throws UnknownHostException { private int deriveNumericScope(NetworkInterface ifc)
throws UnknownHostException
{
Enumeration<InetAddress> addresses = ifc.getInetAddresses(); Enumeration<InetAddress> addresses = ifc.getInetAddresses();
while (addresses.hasMoreElements()) { while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement(); InetAddress addr = addresses.nextElement();
@ -373,16 +381,17 @@ class Inet6Address extends InetAddress {
throw new UnknownHostException ("no scope_id found"); throw new UnknownHostException ("no scope_id found");
} }
private int deriveNumericScope (String ifname) throws UnknownHostException { private int deriveNumericScope(String ifname) throws UnknownHostException {
Enumeration<NetworkInterface> en; Enumeration<NetworkInterface> en;
try { try {
en = NetworkInterface.getNetworkInterfaces(); en = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) { } catch (SocketException e) {
throw new UnknownHostException ("could not enumerate local network interfaces"); throw new UnknownHostException(
"could not enumerate local network interfaces");
} }
while (en.hasMoreElements()) { while (en.hasMoreElements()) {
NetworkInterface ifc = en.nextElement(); NetworkInterface ifc = en.nextElement();
if (ifc.getName().equals (ifname)) { if (ifc.getName().equals(ifname)) {
Enumeration<InetAddress> addresses = ifc.getInetAddresses(); Enumeration<InetAddress> addresses = ifc.getInetAddresses();
while (addresses.hasMoreElements()) { while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement(); InetAddress addr = addresses.nextElement();
@ -400,7 +409,8 @@ class Inet6Address extends InetAddress {
} }
} }
} }
throw new UnknownHostException ("No matching address found for interface : " +ifname); throw new UnknownHostException(
"No matching address found for interface : " +ifname);
} }
/** /**
@ -410,22 +420,14 @@ class Inet6Address extends InetAddress {
*/ */
private void readObject(ObjectInputStream s) private void readObject(ObjectInputStream s)
throws IOException, ClassNotFoundException { throws IOException, ClassNotFoundException {
scope_ifname = null;
scope_ifname_set = false;
s.defaultReadObject(); s.defaultReadObject();
if (ifname != null && !"".equals (ifname)) { if (ifname != null && !ifname.equals("")) {
try { try {
scope_ifname = NetworkInterface.getByName(ifname); scope_ifname = NetworkInterface.getByName(ifname);
if (scope_ifname == null) { if (scope_ifname != null) {
/* the interface does not exist on this system, so we clear
* the scope information completely */
scope_id_set = false;
scope_ifname_set = false;
scope_id = 0;
} else {
try { try {
scope_id = deriveNumericScope (scope_ifname); scope_id = deriveNumericScope(scope_ifname);
} catch (UnknownHostException e) { } catch (UnknownHostException e) {
// typically should not happen, but it may be that // typically should not happen, but it may be that
// the machine being used for deserialization has // the machine being used for deserialization has
@ -455,8 +457,9 @@ class Inet6Address extends InetAddress {
* address. 11111111 at the start of the address identifies the * address. 11111111 at the start of the address identifies the
* address as being a multicast address. * address as being a multicast address.
* *
* @return a <code>boolean</code> indicating if the InetAddress is * @return a {@code boolean} indicating if the InetAddress is an IP
* an IP multicast address * multicast address
*
* @since JDK1.1 * @since JDK1.1
*/ */
@Override @Override
@ -466,8 +469,10 @@ class Inet6Address extends InetAddress {
/** /**
* Utility routine to check if the InetAddress in a wildcard address. * Utility routine to check if the InetAddress in a wildcard address.
* @return a <code>boolean</code> indicating if the Inetaddress is *
* @return a {@code boolean} indicating if the Inetaddress is
* a wildcard address. * a wildcard address.
*
* @since 1.4 * @since 1.4
*/ */
@Override @Override
@ -482,8 +487,9 @@ class Inet6Address extends InetAddress {
/** /**
* Utility routine to check if the InetAddress is a loopback address. * Utility routine to check if the InetAddress is a loopback address.
* *
* @return a <code>boolean</code> indicating if the InetAddress is * @return a {@code boolean} indicating if the InetAddress is a loopback
* a loopback address; or false otherwise. * address; or false otherwise.
*
* @since 1.4 * @since 1.4
*/ */
@Override @Override
@ -498,8 +504,9 @@ class Inet6Address extends InetAddress {
/** /**
* Utility routine to check if the InetAddress is an link local address. * Utility routine to check if the InetAddress is an link local address.
* *
* @return a <code>boolean</code> indicating if the InetAddress is * @return a {@code boolean} indicating if the InetAddress is a link local
* a link local address; or false if address is not a link local unicast address. * address; or false if address is not a link local unicast address.
*
* @since 1.4 * @since 1.4
*/ */
@Override @Override
@ -511,8 +518,9 @@ class Inet6Address extends InetAddress {
/** /**
* Utility routine to check if the InetAddress is a site local address. * Utility routine to check if the InetAddress is a site local address.
* *
* @return a <code>boolean</code> indicating if the InetAddress is * @return a {@code boolean} indicating if the InetAddress is a site local
* a site local address; or false if address is not a site local unicast address. * address; or false if address is not a site local unicast address.
*
* @since 1.4 * @since 1.4
*/ */
@Override @Override
@ -524,9 +532,10 @@ class Inet6Address extends InetAddress {
/** /**
* Utility routine to check if the multicast address has global scope. * Utility routine to check if the multicast address has global scope.
* *
* @return a <code>boolean</code> indicating if the address has * @return a {@code boolean} indicating if the address has is a multicast
* is a multicast address of global scope, false if it is not * address of global scope, false if it is not of global scope or
* of global scope or it is not a multicast address * it is not a multicast address
*
* @since 1.4 * @since 1.4
*/ */
@Override @Override
@ -538,9 +547,10 @@ class Inet6Address extends InetAddress {
/** /**
* Utility routine to check if the multicast address has node scope. * Utility routine to check if the multicast address has node scope.
* *
* @return a <code>boolean</code> indicating if the address has * @return a {@code boolean} indicating if the address has is a multicast
* is a multicast address of node-local scope, false if it is not * address of node-local scope, false if it is not of node-local
* of node-local scope or it is not a multicast address * scope or it is not a multicast address
*
* @since 1.4 * @since 1.4
*/ */
@Override @Override
@ -552,9 +562,10 @@ class Inet6Address extends InetAddress {
/** /**
* Utility routine to check if the multicast address has link scope. * Utility routine to check if the multicast address has link scope.
* *
* @return a <code>boolean</code> indicating if the address has * @return a {@code boolean} indicating if the address has is a multicast
* is a multicast address of link-local scope, false if it is not * address of link-local scope, false if it is not of link-local
* of link-local scope or it is not a multicast address * scope or it is not a multicast address
*
* @since 1.4 * @since 1.4
*/ */
@Override @Override
@ -566,9 +577,10 @@ class Inet6Address extends InetAddress {
/** /**
* Utility routine to check if the multicast address has site scope. * Utility routine to check if the multicast address has site scope.
* *
* @return a <code>boolean</code> indicating if the address has * @return a {@code boolean} indicating if the address has is a multicast
* is a multicast address of site-local scope, false if it is not * address of site-local scope, false if it is not of site-local
* of site-local scope or it is not a multicast address * scope or it is not a multicast address
*
* @since 1.4 * @since 1.4
*/ */
@Override @Override
@ -580,10 +592,10 @@ class Inet6Address extends InetAddress {
/** /**
* Utility routine to check if the multicast address has organization scope. * Utility routine to check if the multicast address has organization scope.
* *
* @return a <code>boolean</code> indicating if the address has * @return a {@code boolean} indicating if the address has is a multicast
* is a multicast address of organization-local scope, * address of organization-local scope, false if it is not of
* false if it is not of organization-local scope * organization-local scope or it is not a multicast address
* or it is not a multicast address *
* @since 1.4 * @since 1.4
*/ */
@Override @Override
@ -593,9 +605,9 @@ class Inet6Address extends InetAddress {
} }
/** /**
* Returns the raw IP address of this <code>InetAddress</code> * Returns the raw IP address of this {@code InetAddress} object. The result
* object. The result is in network byte order: the highest order * is in network byte order: the highest order byte of the address is in
* byte of the address is in <code>getAddress()[0]</code>. * {@code getAddress()[0]}.
* *
* @return the raw IP address of this object. * @return the raw IP address of this object.
*/ */
@ -609,9 +621,10 @@ class Inet6Address extends InetAddress {
* an interface. If no scoped_id is set, the returned value is zero. * an interface. If no scoped_id is set, the returned value is zero.
* *
* @return the scopeId, or zero if not set. * @return the scopeId, or zero if not set.
*
* @since 1.5 * @since 1.5
*/ */
public int getScopeId () { public int getScopeId() {
return scope_id; return scope_id;
} }
@ -622,22 +635,23 @@ class Inet6Address extends InetAddress {
* @return the scoped interface, or null if not set. * @return the scoped interface, or null if not set.
* @since 1.5 * @since 1.5
*/ */
public NetworkInterface getScopedInterface () { public NetworkInterface getScopedInterface() {
return scope_ifname; return scope_ifname;
} }
/** /**
* Returns the IP address string in textual presentation. If the instance was created * Returns the IP address string in textual presentation. If the instance
* specifying a scope identifier then the scope id is appended to the IP address preceded by * was created specifying a scope identifier then the scope id is appended
* a "%" (per-cent) character. This can be either a numeric value or a string, depending on which * to the IP address preceded by a "%" (per-cent) character. This can be
* was used to createthe instance. * either a numeric value or a string, depending on which was used to create
* the instance.
* *
* @return the raw IP address in a string format. * @return the raw IP address in a string format.
*/ */
@Override @Override
public String getHostAddress() { public String getHostAddress() {
String s = numericToTextFormat(ipaddress); String s = numericToTextFormat(ipaddress);
if (scope_ifname_set) { /* must check this first */ if (scope_ifname != null) { /* must check this first */
s = s + "%" + scope_ifname.getName(); s = s + "%" + scope_ifname.getName();
} else if (scope_id_set) { } else if (scope_id_set) {
s = s + "%" + scope_id; s = s + "%" + scope_id;
@ -674,29 +688,27 @@ class Inet6Address extends InetAddress {
} }
/** /**
* Compares this object against the specified object. * Compares this object against the specified object. The result is {@code
* The result is <code>true</code> if and only if the argument is * true} if and only if the argument is not {@code null} and it represents
* not <code>null</code> and it represents the same IP address as * the same IP address as this object.
* this object. *
* <p> * <p> Two instances of {@code InetAddress} represent the same IP address
* Two instances of <code>InetAddress</code> represent the same IP * if the length of the byte arrays returned by {@code getAddress} is the
* address if the length of the byte arrays returned by * same for both, and each of the array components is the same for the byte
* <code>getAddress</code> is the same for both, and each of the * arrays.
* array components is the same for the byte arrays.
* *
* @param obj the object to compare against. * @param obj the object to compare against.
* @return <code>true</code> if the objects are the same; *
* <code>false</code> otherwise. * @return {@code true} if the objects are the same; {@code false} otherwise.
*
* @see java.net.InetAddress#getAddress() * @see java.net.InetAddress#getAddress()
*/ */
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (obj == null || if (obj == null || !(obj instanceof Inet6Address))
!(obj instanceof Inet6Address))
return false; return false;
Inet6Address inetAddr = (Inet6Address)obj; Inet6Address inetAddr = (Inet6Address)obj;
for (int i = 0; i < INADDRSZ; i++) { for (int i = 0; i < INADDRSZ; i++) {
if (ipaddress[i] != inetAddr.ipaddress[i]) if (ipaddress[i] != inetAddr.ipaddress[i])
return false; return false;
@ -709,8 +721,9 @@ class Inet6Address extends InetAddress {
* Utility routine to check if the InetAddress is an * Utility routine to check if the InetAddress is an
* IPv4 compatible IPv6 address. * IPv4 compatible IPv6 address.
* *
* @return a <code>boolean</code> indicating if the InetAddress is * @return a {@code boolean} indicating if the InetAddress is an IPv4
* an IPv4 compatible IPv6 address; or false if address is IPv4 address. * compatible IPv6 address; or false if address is IPv4 address.
*
* @since 1.4 * @since 1.4
*/ */
public boolean isIPv4CompatibleAddress() { public boolean isIPv4CompatibleAddress() {
@ -727,6 +740,7 @@ class Inet6Address extends InetAddress {
// Utilities // Utilities
private final static int INT16SZ = 2; private final static int INT16SZ = 2;
/* /*
* Convert IPv6 binary address into presentation (printable) format. * Convert IPv6 binary address into presentation (printable) format.
* *
@ -735,9 +749,8 @@ class Inet6Address extends InetAddress {
* textual representation format * textual representation format
* @since 1.4 * @since 1.4
*/ */
static String numericToTextFormat(byte[] src) static String numericToTextFormat(byte[] src) {
{ StringBuilder sb = new StringBuilder(39);
StringBuffer sb = new StringBuffer(39);
for (int i = 0; i < (INADDRSZ / INT16SZ); i++) { for (int i = 0; i < (INADDRSZ / INT16SZ); i++) {
sb.append(Integer.toHexString(((src[i<<1]<<8) & 0xff00) sb.append(Integer.toHexString(((src[i<<1]<<8) & 0xff00)
| (src[(i<<1)+1] & 0xff))); | (src[(i<<1)+1] & 0xff)));
@ -766,9 +779,8 @@ class Inet6Address extends InetAddress {
private synchronized void writeObject(java.io.ObjectOutputStream s) private synchronized void writeObject(java.io.ObjectOutputStream s)
throws IOException throws IOException
{ {
if (scope_ifname_set) { if (scope_ifname != null)
ifname = scope_ifname.getName(); ifname = scope_ifname.getName();
}
s.defaultWriteObject(); s.defaultWriteObject();
} }
} }

View File

@ -1,5 +1,5 @@
<!-- <!--
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
@ -237,6 +237,6 @@ tuning on how the cache is operating.</P>
</UL> </UL>
<P>Since these 2 properties are part of the security policy, they are <P>Since these 2 properties are part of the security policy, they are
not set by either the -D option or the System.setProperty() API, not set by either the -D option or the System.setProperty() API,
instead they are set in the JRE security policy file <code>lib/security/java.security</code>.</P> instead they are set as security properties.</P>
</BODY> </BODY>
</HTML> </HTML>

View File

@ -695,27 +695,23 @@ public class KeyStore {
} }
/** /**
* Returns the default keystore type as specified in the Java security * Returns the default keystore type as specified by the
* properties file, or the string * {@code keystore.type} security property, or the string
* &quot;jks&quot; (acronym for &quot;Java keystore&quot;) * {@literal "jks"} (acronym for {@literal "Java keystore"})
* if no such property exists. * if no such property exists.
* The Java security properties file is located in the file named
* &lt;JAVA_HOME&gt;/lib/security/java.security.
* &lt;JAVA_HOME&gt; refers to the value of the java.home system property,
* and specifies the directory where the JRE is installed.
* *
* <p>The default keystore type can be used by applications that do not * <p>The default keystore type can be used by applications that do not
* want to use a hard-coded keystore type when calling one of the * want to use a hard-coded keystore type when calling one of the
* <code>getInstance</code> methods, and want to provide a default keystore * {@code getInstance} methods, and want to provide a default keystore
* type in case a user does not specify its own. * type in case a user does not specify its own.
* *
* <p>The default keystore type can be changed by setting the value of the * <p>The default keystore type can be changed by setting the value of the
* "keystore.type" security property (in the Java security properties * {@code keystore.type} security property to the desired keystore type.
* file) to the desired keystore type.
* *
* @return the default keystore type as specified in the * @return the default keystore type as specified by the
* Java security properties file, or the string &quot;jks&quot; * {@code keystore.type} security property, or the string {@literal "jks"}
* if no such property exists. * if no such property exists.
* @see java.security.Security security properties
*/ */
public final static String getDefaultType() { public final static String getDefaultType() {
String kstype; String kstype;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2011, 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
@ -48,12 +48,8 @@ import sun.security.util.SecurityConstants;
* <code>getPolicy</code> installs an instance of the default Policy * <code>getPolicy</code> installs an instance of the default Policy
* implementation (a default subclass implementation of this abstract class). * implementation (a default subclass implementation of this abstract class).
* The default Policy implementation can be changed by setting the value * The default Policy implementation can be changed by setting the value
* of the "policy.provider" security property (in the Java security properties * of the {@code policy.provider} security property to the fully qualified
* file) to the fully qualified name of the desired Policy subclass * name of the desired Policy subclass implementation.
* implementation. The Java security properties file is located in the
* file named &lt;JAVA_HOME&gt;/lib/security/java.security.
* &lt;JAVA_HOME&gt; refers to the value of the java.home system property,
* and specifies the directory where the JRE is installed.
* *
* <p> Application code can directly subclass Policy to provide a custom * <p> Application code can directly subclass Policy to provide a custom
* implementation. In addition, an instance of a Policy object can be * implementation. In addition, an instance of a Policy object can be
@ -84,6 +80,7 @@ import sun.security.util.SecurityConstants;
* @see java.security.Provider * @see java.security.Provider
* @see java.security.ProtectionDomain * @see java.security.ProtectionDomain
* @see java.security.Permission * @see java.security.Permission
* @see java.security.Security security properties
*/ */
public abstract class Policy { public abstract class Policy {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 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
@ -39,6 +39,10 @@ import sun.security.jca.*;
* <p>This class centralizes all security properties and common security * <p>This class centralizes all security properties and common security
* methods. One of its primary uses is to manage providers. * methods. One of its primary uses is to manage providers.
* *
* <p>The default values of security properties are read from an
* implementation-specific location, which is typically the properties file
* {@code lib/security/java.security} in the Java installation directory.
*
* @author Benjamin Renaud * @author Benjamin Renaud
*/ */

View File

@ -281,25 +281,23 @@ public class CertPathBuilder {
} }
/** /**
* Returns the default <code>CertPathBuilder</code> type as specified in * Returns the default {@code CertPathBuilder} type as specified by
* the Java security properties file, or the string &quot;PKIX&quot; * the {@code certpathbuilder.type} security property, or the string
* if no such property exists. The Java security properties file is * {@literal "PKIX"} if no such property exists.
* located in the file named &lt;JAVA_HOME&gt;/lib/security/java.security.
* &lt;JAVA_HOME&gt; refers to the value of the java.home system property,
* and specifies the directory where the JRE is installed.
* *
* <p>The default <code>CertPathBuilder</code> type can be used by * <p>The default {@code CertPathBuilder} type can be used by
* applications that do not want to use a hard-coded type when calling one * applications that do not want to use a hard-coded type when calling one
* of the <code>getInstance</code> methods, and want to provide a default * of the {@code getInstance} methods, and want to provide a default
* type in case a user does not specify its own. * type in case a user does not specify its own.
* *
* <p>The default <code>CertPathBuilder</code> type can be changed by * <p>The default {@code CertPathBuilder} type can be changed by
* setting the value of the "certpathbuilder.type" security property * setting the value of the {@code certpathbuilder.type} security property
* (in the Java security properties file) to the desired type. * to the desired type.
* *
* @return the default <code>CertPathBuilder</code> type as specified * @see java.security.Security security properties
* in the Java security properties file, or the string &quot;PKIX&quot; * @return the default {@code CertPathBuilder} type as specified
* if no such property exists. * by the {@code certpathbuilder.type} security property, or the string
* {@literal "PKIX"} if no such property exists.
*/ */
public final static String getDefaultType() { public final static String getDefaultType() {
String cpbtype = String cpbtype =

View File

@ -293,25 +293,23 @@ public class CertPathValidator {
} }
/** /**
* Returns the default <code>CertPathValidator</code> type as specified in * Returns the default {@code CertPathValidator} type as specified by
* the Java security properties file, or the string &quot;PKIX&quot; * the {@code certpathvalidator.type} security property, or the string
* if no such property exists. The Java security properties file is * {@literal "PKIX"} if no such property exists.
* located in the file named &lt;JAVA_HOME&gt;/lib/security/java.security.
* &lt;JAVA_HOME&gt; refers to the value of the java.home system property,
* and specifies the directory where the JRE is installed.
* *
* <p>The default <code>CertPathValidator</code> type can be used by * <p>The default {@code CertPathValidator} type can be used by
* applications that do not want to use a hard-coded type when calling one * applications that do not want to use a hard-coded type when calling one
* of the <code>getInstance</code> methods, and want to provide a default * of the {@code getInstance} methods, and want to provide a default
* type in case a user does not specify its own. * type in case a user does not specify its own.
* *
* <p>The default <code>CertPathValidator</code> type can be changed by * <p>The default {@code CertPathValidator} type can be changed by
* setting the value of the "certpathvalidator.type" security property * setting the value of the {@code certpathvalidator.type} security
* (in the Java security properties file) to the desired type. * property to the desired type.
* *
* @return the default <code>CertPathValidator</code> type as specified * @see java.security.Security security properties
* in the Java security properties file, or the string &quot;PKIX&quot; * @return the default {@code CertPathValidator} type as specified
* if no such property exists. * by the {@code certpathvalidator.type} security property, or the string
* {@literal "PKIX"} if no such property exists.
*/ */
public final static String getDefaultType() { public final static String getDefaultType() {
String cpvtype = String cpvtype =

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 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
@ -389,25 +389,23 @@ public class CertStore {
} }
/** /**
* Returns the default <code>CertStore</code> type as specified in the * Returns the default {@code CertStore} type as specified by the
* Java security properties file, or the string &quot;LDAP&quot; if no * {@code certstore.type} security property, or the string
* such property exists. The Java security properties file is located in * {@literal "LDAP"} if no such property exists.
* the file named &lt;JAVA_HOME&gt;/lib/security/java.security.
* &lt;JAVA_HOME&gt; refers to the value of the java.home system property,
* and specifies the directory where the JRE is installed.
* *
* <p>The default <code>CertStore</code> type can be used by applications * <p>The default {@code CertStore} type can be used by applications
* that do not want to use a hard-coded type when calling one of the * that do not want to use a hard-coded type when calling one of the
* <code>getInstance</code> methods, and want to provide a default * {@code getInstance} methods, and want to provide a default
* <code>CertStore</code> type in case a user does not specify its own. * {@code CertStore} type in case a user does not specify its own.
* *
* <p>The default <code>CertStore</code> type can be changed by setting * <p>The default {@code CertStore} type can be changed by setting
* the value of the "certstore.type" security property (in the Java * the value of the {@code certstore.type} security property to the
* security properties file) to the desired type. * desired type.
* *
* @return the default <code>CertStore</code> type as specified in the * @see java.security.Security security properties
* Java security properties file, or the string &quot;LDAP&quot; * @return the default {@code CertStore} type as specified by the
* if no such property exists. * {@code certstore.type} security property, or the string
* {@literal "LDAP"} if no such property exists.
*/ */
public final static String getDefaultType() { public final static String getDefaultType() {
String cstype; String cstype;

View File

@ -688,7 +688,16 @@ public class DateFormatSymbols implements Serializable, Cloneable {
} }
ResourceBundle resource = adapter.getLocaleData().getDateFormatData(locale); ResourceBundle resource = adapter.getLocaleData().getDateFormatData(locale);
eras = resource.getStringArray("Eras"); // 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");
} 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");

View File

@ -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 {
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 {
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 {
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 {
// 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 {
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 {
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 {
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 {
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 {
&& 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.

View File

@ -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 {
* 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 {
* 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>

View File

@ -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
*/ */
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
* @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
} }
/** /**
* 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
* @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
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
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

View File

@ -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 {
// "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,27 +972,37 @@ 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 (field == ERA) { if (names != null) {
int size = names.size(); if (field == ERA) {
if (style == ALL_STYLES) { int size = names.size();
size /= 2; // SHORT and LONG if (style == ALL_STYLES) {
} Set<Integer> values = new HashSet<>();
if (size < eras.length) { // count unique era values
int baseStyle = getBaseStyle(style); for (String key : names.keySet()) {
for (int i = size; i < eras.length; i++) { values.add(names.get(key));
Era era = eras[i];
if (baseStyle == ALL_STYLES || baseStyle == SHORT) {
names.put(era.getAbbreviation(), i);
} }
if (baseStyle == ALL_STYLES || baseStyle == LONG) { size = values.size();
names.put(era.getName(), i); }
if (size < eras.length) {
int baseStyle = getBaseStyle(style);
for (int i = size; i < eras.length; i++) {
Era era = eras[i];
if (baseStyle == ALL_STYLES || baseStyle == SHORT
|| baseStyle == NARROW_FORMAT) {
names.put(era.getAbbreviation(), i);
}
if (baseStyle == ALL_STYLES || baseStyle == LONG) {
names.put(era.getName(), i);
}
} }
} }
} }

View File

@ -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,28 +399,23 @@ 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) {
if (id.startsWith("GMT") && id.length() > 3) { return name;
char sign = id.charAt(3);
if (sign == '+' || sign == '-') {
return id;
}
}
int offset = getRawOffset();
if (daylight) {
offset += getDSTSavings();
}
return ZoneInfoFile.toCustomID(offset);
} }
int index = daylight ? 3 : 1; if (id.startsWith("GMT") && id.length() > 3) {
if (style == SHORT) { char sign = id.charAt(3);
index++; if (sign == '+' || sign == '-') {
return id;
}
} }
return names[index]; int offset = getRawOffset();
if (daylight) {
offset += getDSTSavings();
}
return ZoneInfoFile.toCustomID(offset);
} }
private static class DisplayNames { private static class DisplayNames {
@ -429,9 +424,12 @@ abstract public class TimeZone implements Serializable, Cloneable {
// 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 {
} }
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 {
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;
} }

View File

@ -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
@ -150,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<>();
@ -243,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.
@ -971,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) {
@ -1269,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);
}
}
}
} }

View File

@ -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 {
* 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 {
* <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 {
* {@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

View File

@ -1,5 +1,5 @@
/* /*
* 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 {
* @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;
}
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 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
@ -53,17 +53,13 @@ public class KeyManagerFactory {
* Obtains the default KeyManagerFactory algorithm name. * Obtains the default KeyManagerFactory algorithm name.
* *
* <p>The default algorithm can be changed at runtime by setting * <p>The default algorithm can be changed at runtime by setting
* the value of the "ssl.KeyManagerFactory.algorithm" security * the value of the {@code ssl.KeyManagerFactory.algorithm}
* property (set in the Java security properties file or by calling * security property to the desired algorithm name.
* {@link java.security.Security#setProperty(java.lang.String,
* java.lang.String)})
* to the desired algorithm name.
* *
* @see java.security.Security#setProperty(java.lang.String, * @see java.security.Security security properties
* java.lang.String) * @return the default algorithm name as specified by the
* @return the default algorithm name as specified in the * {@code ssl.KeyManagerFactory.algorithm} security property, or an
* Java security properties, or an implementation-specific * implementation-specific default if no such property exists.
* default if no such property exists.
*/ */
public final static String getDefaultAlgorithm() { public final static String getDefaultAlgorithm() {
String type; String type;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 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
@ -53,14 +53,13 @@ public class TrustManagerFactory {
* Obtains the default TrustManagerFactory algorithm name. * Obtains the default TrustManagerFactory algorithm name.
* *
* <p>The default TrustManager can be changed at runtime by setting * <p>The default TrustManager can be changed at runtime by setting
* the value of the "ssl.TrustManagerFactory.algorithm" security * the value of the {@code ssl.TrustManagerFactory.algorithm}
* property (set in the Java security properties file or by calling * security property to the desired algorithm name.
* {@link java.security.Security#setProperty(String, String) })
* to the desired algorithm name.
* *
* @return the default algorithm name as specified in the * @see java.security.Security security properties
* Java security properties, or an implementation-specific default * @return the default algorithm name as specified by the
* if no such property exists. * {@code ssl.TrustManagerFactory.algorithm} security property, or an
* implementation-specific default if no such property exists.
*/ */
public final static String getDefaultAlgorithm() { public final static String getDefaultAlgorithm() {
String type; String type;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2010, 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
@ -126,14 +126,9 @@ import sun.security.util.Debug;
* are rejected. Such permission must be listed in the * are rejected. Such permission must be listed in the
* <code>java.security.Policy</code>. * <code>java.security.Policy</code>.
* *
* <p> The default <code>Policy</code> implementation can be changed by * <p> The default {@code Policy} implementation can be changed by
* setting the value of the "auth.policy.provider" security property * setting the value of the {@code auth.policy.provider} security property to
* (in the Java security properties file) to the fully qualified name of * the fully qualified name of the desired {@code Policy} implementation class.
* the desired <code>Policy</code> implementation class.
* The Java security properties file is located in the file named
* &lt;JAVA_HOME&gt;/lib/security/java.security.
* &lt;JAVA_HOME&gt; refers to the value of the java.home system property,
* and specifies the directory where the JRE is installed.
* *
* @deprecated as of JDK version 1.4 -- Replaced by java.security.Policy. * @deprecated as of JDK version 1.4 -- Replaced by java.security.Policy.
* java.security.Policy has a method: * java.security.Policy has a method:
@ -154,7 +149,7 @@ import sun.security.util.Debug;
* These two APIs provide callers the means to query the * These two APIs provide callers the means to query the
* Policy for Principal-based Permission entries. * Policy for Principal-based Permission entries.
* *
* * @see java.security.Security security properties
*/ */
@Deprecated @Deprecated
public abstract class Policy { public abstract class Policy {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2005, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 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
@ -49,13 +49,9 @@ package javax.security.auth.callback;
* can then choose to prompt for a username and password serially, * can then choose to prompt for a username and password serially,
* or to prompt for both in a single window. * or to prompt for both in a single window.
* *
* <p> A default <code>CallbackHandler</code> class implementation * <p> A default {@code CallbackHandler} class implementation
* may be specified in the <i>auth.login.defaultCallbackHandler</i> * may be specified by setting the value of the
* security property. The security property can be set * {@code auth.login.defaultCallbackHandler} security property.
* in the Java security properties file located in the file named
* &lt;JAVA_HOME&gt;/lib/security/java.security.
* &lt;JAVA_HOME&gt; refers to the value of the java.home system property,
* and specifies the directory where the JRE is installed.
* *
* <p> If the security property is set to the fully qualified name of a * <p> If the security property is set to the fully qualified name of a
* <code>CallbackHandler</code> implementation class, * <code>CallbackHandler</code> implementation class,
@ -67,6 +63,7 @@ package javax.security.auth.callback;
* <p> All default handler implementations must provide a public * <p> All default handler implementations must provide a public
* zero-argument constructor. * zero-argument constructor.
* *
* @see java.security.Security security properties
*/ */
public interface CallbackHandler { public interface CallbackHandler {

View File

@ -1,5 +1,5 @@
/* /*
* 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
@ -173,12 +173,8 @@ import sun.security.jca.GetInstance;
* Configuration implementation (a default subclass implementation of this * Configuration implementation (a default subclass implementation of this
* abstract class). * abstract class).
* The default Configuration implementation can be changed by setting the value * The default Configuration implementation can be changed by setting the value
* of the "login.configuration.provider" security property (in the Java * of the {@code login.configuration.provider} security property to the fully
* security properties file) to the fully qualified name of the desired * qualified name of the desired Configuration subclass implementation.
* Configuration subclass implementation. The Java security properties file
* is located in the file named &lt;JAVA_HOME&gt;/lib/security/java.security.
* &lt;JAVA_HOME&gt; refers to the value of the java.home system property,
* and specifies the directory where the JRE is installed.
* *
* <p> Application code can directly subclass Configuration to provide a custom * <p> Application code can directly subclass Configuration to provide a custom
* implementation. In addition, an instance of a Configuration object can be * implementation. In addition, an instance of a Configuration object can be
@ -190,6 +186,7 @@ import sun.security.jca.GetInstance;
* for a list of standard Configuration types. * for a list of standard Configuration types.
* *
* @see javax.security.auth.login.LoginContext * @see javax.security.auth.login.LoginContext
* @see java.security.Security security properties
*/ */
public abstract class Configuration { public abstract class Configuration {

View File

@ -1,5 +1,5 @@
/* /*
* 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
@ -163,9 +163,9 @@ import sun.security.util.ResourcesMgr;
* input parameter, or if the caller specifies a <code>null</code> * input parameter, or if the caller specifies a <code>null</code>
* CallbackHandler object (and a <code>null</code> value is permitted), * CallbackHandler object (and a <code>null</code> value is permitted),
* the LoginContext queries the * the LoginContext queries the
* <i>auth.login.defaultCallbackHandler</i> security property * {@code auth.login.defaultCallbackHandler} security property for the
* for the fully qualified class name of a default handler implementation. * fully qualified class name of a default handler
* If the security property is not set, * implementation. If the security property is not set,
* then the underlying modules will not have a * then the underlying modules will not have a
* CallbackHandler for use in communicating * CallbackHandler for use in communicating
* with users. The caller thus assumes that the configured * with users. The caller thus assumes that the configured
@ -184,21 +184,13 @@ import sun.security.util.ResourcesMgr;
* </ul> * </ul>
* </ol> * </ol>
* *
* <p> Note that Security Properties
* (such as <code>auth.login.defaultCallbackHandler</code>)
* can be set programmatically via the
* <code>java.security.Security</code> class,
* or statically in the Java security properties file located in the
* file named &lt;JAVA_HOME&gt;/lib/security/java.security.
* &lt;JAVA_HOME&gt; refers to the value of the java.home system property,
* and specifies the directory where the JRE is installed.
*
* @see java.security.Security * @see java.security.Security
* @see javax.security.auth.AuthPermission * @see javax.security.auth.AuthPermission
* @see javax.security.auth.Subject * @see javax.security.auth.Subject
* @see javax.security.auth.callback.CallbackHandler * @see javax.security.auth.callback.CallbackHandler
* @see javax.security.auth.login.Configuration * @see javax.security.auth.login.Configuration
* @see javax.security.auth.spi.LoginModule * @see javax.security.auth.spi.LoginModule
* @see java.security.Security security properties
*/ */
public class LoginContext { public class LoginContext {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2011, 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
@ -96,21 +96,17 @@ import java.util.Date;
* </pre> * </pre>
* <p> * <p>
* In either case, the code that instantiates an X.509 certificate * In either case, the code that instantiates an X.509 certificate
* consults the Java security properties file to locate the actual * consults the value of the {@code cert.provider.x509v1} security property
* implementation or instantiates a default implementation. * to locate the actual implementation or instantiates a default implementation.
* <p> * <p>
* The Java security properties file is located in the file named * The {@code cert.provider.x509v1} property is set to a default
* &lt;JAVA_HOME&gt;/lib/security/java.security. * implementation for X.509 such as:
* &lt;JAVA_HOME&gt; refers to the value of the java.home system property,
* and specifies the directory where the JRE is installed.
* In the Security properties file, a default implementation
* for X.509 v1 may be given such as:
* <pre> * <pre>
* cert.provider.x509v1=com.sun.security.cert.internal.x509.X509V1CertImpl * cert.provider.x509v1=com.sun.security.cert.internal.x509.X509V1CertImpl
* </pre> * </pre>
* <p> * <p>
* The value of this <code>cert.provider.x509v1</code> property has to be * The value of this {@code cert.provider.x509v1} property has to be
* changed to instatiate another implementation. If this security * changed to instantiate another implementation. If this security
* property is not set, a default implementation will be used. * property is not set, a default implementation will be used.
* Currently, due to possible security restrictions on access to * Currently, due to possible security restrictions on access to
* Security properties, this value is looked up and cached at class * Security properties, this value is looked up and cached at class
@ -127,6 +123,7 @@ import java.util.Date;
* @since 1.4 * @since 1.4
* @see Certificate * @see Certificate
* @see java.security.cert.X509Extension * @see java.security.cert.X509Extension
* @see java.security.Security security properties
*/ */
public abstract class X509Certificate extends Certificate { public abstract class X509Certificate extends Certificate {
@ -156,8 +153,7 @@ public abstract class X509Certificate extends Certificate {
* the data read from the input stream <code>inStream</code>. * the data read from the input stream <code>inStream</code>.
* The implementation (X509Certificate is an abstract class) is * The implementation (X509Certificate is an abstract class) is
* provided by the class specified as the value of the * provided by the class specified as the value of the
* <code>cert.provider.x509v1</code> * {@code cert.provider.x509v1} security property.
* property in the security properties file.
* *
* <p>Note: Only one DER-encoded * <p>Note: Only one DER-encoded
* certificate is expected to be in the input stream. * certificate is expected to be in the input stream.
@ -184,8 +180,7 @@ public abstract class X509Certificate extends Certificate {
* the specified byte array. * the specified byte array.
* The implementation (X509Certificate is an abstract class) is * The implementation (X509Certificate is an abstract class) is
* provided by the class specified as the value of the * provided by the class specified as the value of the
* <code>cert.provider.x509v1</code> * {@code cert.provider.x509v1} security property.
* property in the security properties file.
* *
* <p>Note: All X509Certificate * <p>Note: All X509Certificate
* subclasses must provide a constructor of the form: * subclasses must provide a constructor of the form:

View File

@ -31,6 +31,7 @@ import java.util.Map;
import java.net.URL; import java.net.URL;
import java.util.Arrays; import java.util.Arrays;
/** /**
* A serialized version of an <code>Array</code> * A serialized version of an <code>Array</code>
* object, which is the mapping in the Java programming language of an SQL * object, which is the mapping in the Java programming language of an SQL
@ -41,44 +42,52 @@ import java.util.Arrays;
* methods for getting the base type and the SQL name for the base type, and * methods for getting the base type and the SQL name for the base type, and
* methods for copying all or part of a <code>SerialArray</code> object. * methods for copying all or part of a <code>SerialArray</code> object.
* <P> * <P>
*
* Note: In order for this class to function correctly, a connection to the * Note: In order for this class to function correctly, a connection to the
* data source * data source
* must be available in order for the SQL <code>Array</code> object to be * must be available in order for the SQL <code>Array</code> object to be
* materialized (have all of its elements brought to the client server) * materialized (have all of its elements brought to the client server)
* if necessary. At this time, logical pointers to the data in the data source, * if necessary. At this time, logical pointers to the data in the data source,
* such as locators, are not currently supported. * such as locators, are not currently supported.
*
* <h4> Thread safety </h4>
*
* A SerialArray is not safe for use by multiple concurrent threads. If a
* SerialArray is to be used by more than one thread then access to the
* SerialArray should be controlled by appropriate synchronization.
*
*/ */
public class SerialArray implements Array, Serializable, Cloneable { public class SerialArray implements Array, Serializable, Cloneable {
/** /**
* A serialized array in which each element is an <code>Object</code> * A serialized array in which each element is an <code>Object</code>
* in the Java programming language that represents an element * in the Java programming language that represents an element
* in the SQL <code>ARRAY</code> value. * in the SQL <code>ARRAY</code> value.
* @serial * @serial
*/ */
private Object[] elements; private Object[] elements;
/** /**
* The SQL type of the elements in this <code>SerialArray</code> object. The * The SQL type of the elements in this <code>SerialArray</code> object. The
* type is expressed as one of the constants from the class * type is expressed as one of the constants from the class
* <code>java.sql.Types</code>. * <code>java.sql.Types</code>.
* @serial * @serial
*/ */
private int baseType; private int baseType;
/** /**
* The type name used by the DBMS for the elements in the SQL <code>ARRAY</code> * The type name used by the DBMS for the elements in the SQL <code>ARRAY</code>
* value that this <code>SerialArray</code> object represents. * value that this <code>SerialArray</code> object represents.
* @serial * @serial
*/ */
private String baseTypeName; private String baseTypeName;
/** /**
* The number of elements in this <code>SerialArray</code> object, which * The number of elements in this <code>SerialArray</code> object, which
* is also the number of elements in the SQL <code>ARRAY</code> value * is also the number of elements in the SQL <code>ARRAY</code> value
* that this <code>SerialArray</code> object represents. * that this <code>SerialArray</code> object represents.
* @serial * @serial
*/ */
private int len; private int len;
/** /**
@ -192,24 +201,19 @@ public class SerialArray implements Array, Serializable, Cloneable {
} }
/** /**
* This method frees the <code>Array</code> object and releases the resources that * This method frees the {@code SeriableArray} object and releases the
* it holds. The object is invalid once the <code>free</code> * resources that it holds. The object is invalid once the {@code free}
* method is called. * method is called. <p> If {@code free} is called multiple times, the
*<p> * subsequent calls to {@code free} are treated as a no-op. </P>
* After <code>free</code> has been called, any attempt to invoke a
* method other than <code>free</code> will result in a <code>SQLException</code>
* being thrown. If <code>free</code> is called multiple times, the subsequent
* calls to <code>free</code> are treated as a no-op.
*<p>
* *
* @throws SQLException if an error occurs releasing * @throws SQLException if an error occurs releasing the SerialArray's resources
* the Array's resources
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @since 1.6 * @since 1.6
*/ */
public void free() throws SQLException { public void free() throws SQLException {
throw new SQLFeatureNotSupportedException("Feature not supported"); if (elements != null) {
elements = null;
baseTypeName= null;
}
} }
/** /**
@ -292,129 +296,140 @@ public class SerialArray implements Array, Serializable, Cloneable {
} }
/** /**
* Returns a new array that is a copy of this <code>SerialArray</code> * Returns a new array that is a copy of this <code>SerialArray</code>
* object. * object.
* *
* @return a copy of this <code>SerialArray</code> object as an * @return a copy of this <code>SerialArray</code> object as an
* <code>Object</code> in the Java programming language * <code>Object</code> in the Java programming language
* @throws SerialException if an error occurs retrieving a copy of * @throws SerialException if an error occurs;
* this <code>SerialArray</code> object * if {@code free} had previously been called on this object
*/ */
public Object getArray() throws SerialException { public Object getArray() throws SerialException {
isValid();
Object dst = new Object[len]; Object dst = new Object[len];
System.arraycopy((Object)elements, 0, dst, 0, len); System.arraycopy((Object)elements, 0, dst, 0, len);
return dst; return dst;
} }
//[if an error occurstype map used??] //[if an error occurstype map used??]
/** /**
* Returns a new array that is a copy of this <code>SerialArray</code> * Returns a new array that is a copy of this <code>SerialArray</code>
* object, using the given type map for the custom * object, using the given type map for the custom
* mapping of each element when the elements are SQL UDTs. * mapping of each element when the elements are SQL UDTs.
* <P> * <P>
* This method does custom mapping if the array elements are a UDT * This method does custom mapping if the array elements are a UDT
* and the given type map has an entry for that UDT. * and the given type map has an entry for that UDT.
* Custom mapping is recursive, * Custom mapping is recursive,
* meaning that if, for instance, an element of an SQL structured type * meaning that if, for instance, an element of an SQL structured type
* is an SQL structured type that itself has an element that is an SQL * is an SQL structured type that itself has an element that is an SQL
* structured type, each structured type that has a custom mapping will be * structured type, each structured type that has a custom mapping will be
* mapped according to the given type map. * mapped according to the given type map.
* *
* @param map a <code>java.util.Map</code> object in which * @param map a <code>java.util.Map</code> object in which
* each entry consists of 1) a <code>String</code> object * each entry consists of 1) a <code>String</code> object
* giving the fully qualified name of a UDT and 2) the * giving the fully qualified name of a UDT and 2) the
* <code>Class</code> object for the <code>SQLData</code> implementation * <code>Class</code> object for the <code>SQLData</code> implementation
* that defines how the UDT is to be mapped * that defines how the UDT is to be mapped
* @return a copy of this <code>SerialArray</code> object as an * @return a copy of this <code>SerialArray</code> object as an
* <code>Object</code> in the Java programming language * <code>Object</code> in the Java programming language
* @throws SerialException if an error occurs * @throws SerialException if an error occurs;
*/ * if {@code free} had previously been called on this object
*/
public Object getArray(Map<String, Class<?>> map) throws SerialException { public Object getArray(Map<String, Class<?>> map) throws SerialException {
isValid();
Object dst[] = new Object[len]; Object dst[] = new Object[len];
System.arraycopy((Object)elements, 0, dst, 0, len); System.arraycopy((Object)elements, 0, dst, 0, len);
return dst; return dst;
} }
/** /**
* Returns a new array that is a copy of a slice * Returns a new array that is a copy of a slice
* of this <code>SerialArray</code> object, starting with the * of this <code>SerialArray</code> object, starting with the
* element at the given index and containing the given number * element at the given index and containing the given number
* of consecutive elements. * of consecutive elements.
* *
* @param index the index into this <code>SerialArray</code> object * @param index the index into this <code>SerialArray</code> object
* of the first element to be copied; * of the first element to be copied;
* the index of the first element is <code>0</code> * the index of the first element is <code>0</code>
* @param count the number of consecutive elements to be copied, starting * @param count the number of consecutive elements to be copied, starting
* at the given index * at the given index
* @return a copy of the designated elements in this <code>SerialArray</code> * @return a copy of the designated elements in this <code>SerialArray</code>
* object as an <code>Object</code> in the Java programming language * object as an <code>Object</code> in the Java programming language
* @throws SerialException if an error occurs * @throws SerialException if an error occurs;
*/ * if {@code free} had previously been called on this object
*/
public Object getArray(long index, int count) throws SerialException { public Object getArray(long index, int count) throws SerialException {
isValid();
Object dst = new Object[count]; Object dst = new Object[count];
System.arraycopy((Object)elements, (int)index, dst, 0, count); System.arraycopy((Object)elements, (int)index, dst, 0, count);
return dst; return dst;
} }
/** /**
* Returns a new array that is a copy of a slice * Returns a new array that is a copy of a slice
* of this <code>SerialArray</code> object, starting with the * of this <code>SerialArray</code> object, starting with the
* element at the given index and containing the given number * element at the given index and containing the given number
* of consecutive elements. * of consecutive elements.
* <P> * <P>
* This method does custom mapping if the array elements are a UDT * This method does custom mapping if the array elements are a UDT
* and the given type map has an entry for that UDT. * and the given type map has an entry for that UDT.
* Custom mapping is recursive, * Custom mapping is recursive,
* meaning that if, for instance, an element of an SQL structured type * meaning that if, for instance, an element of an SQL structured type
* is an SQL structured type that itself has an element that is an SQL * is an SQL structured type that itself has an element that is an SQL
* structured type, each structured type that has a custom mapping will be * structured type, each structured type that has a custom mapping will be
* mapped according to the given type map. * mapped according to the given type map.
* *
* @param index the index into this <code>SerialArray</code> object * @param index the index into this <code>SerialArray</code> object
* of the first element to be copied; the index of the * of the first element to be copied; the index of the
* first element in the array is <code>0</code> * first element in the array is <code>0</code>
* @param count the number of consecutive elements to be copied, starting * @param count the number of consecutive elements to be copied, starting
* at the given index * at the given index
* @param map a <code>java.util.Map</code> object in which * @param map a <code>java.util.Map</code> object in which
* each entry consists of 1) a <code>String</code> object * each entry consists of 1) a <code>String</code> object
* giving the fully qualified name of a UDT and 2) the * giving the fully qualified name of a UDT and 2) the
* <code>Class</code> object for the <code>SQLData</code> implementation * <code>Class</code> object for the <code>SQLData</code> implementation
* that defines how the UDT is to be mapped * that defines how the UDT is to be mapped
* @return a copy of the designated elements in this <code>SerialArray</code> * @return a copy of the designated elements in this <code>SerialArray</code>
* object as an <code>Object</code> in the Java programming language * object as an <code>Object</code> in the Java programming language
* @throws SerialException if an error occurs * @throws SerialException if an error occurs;
*/ * if {@code free} had previously been called on this object
*/
public Object getArray(long index, int count, Map<String,Class<?>> map) public Object getArray(long index, int count, Map<String,Class<?>> map)
throws SerialException throws SerialException
{ {
isValid();
Object dst = new Object[count]; Object dst = new Object[count];
System.arraycopy((Object)elements, (int)index, dst, 0, count); System.arraycopy((Object)elements, (int)index, dst, 0, count);
return dst; return dst;
} }
/** /**
* Retrieves the SQL type of the elements in this <code>SerialArray</code> * Retrieves the SQL type of the elements in this <code>SerialArray</code>
* object. The <code>int</code> returned is one of the constants in the class * object. The <code>int</code> returned is one of the constants in the class
* <code>java.sql.Types</code>. * <code>java.sql.Types</code>.
* *
* @return one of the constants in <code>java.sql.Types</code>, indicating * @return one of the constants in <code>java.sql.Types</code>, indicating
* the SQL type of the elements in this <code>SerialArray</code> object * the SQL type of the elements in this <code>SerialArray</code> object
* @throws SerialException if an error occurs * @throws SerialException if an error occurs;
*/ * if {@code free} had previously been called on this object
*/
public int getBaseType() throws SerialException { public int getBaseType() throws SerialException {
isValid();
return baseType; return baseType;
} }
/** /**
* Retrieves the DBMS-specific type name for the elements in this * Retrieves the DBMS-specific type name for the elements in this
* <code>SerialArray</code> object. * <code>SerialArray</code> object.
* *
* @return the SQL type name used by the DBMS for the base type of this * @return the SQL type name used by the DBMS for the base type of this
* <code>SerialArray</code> object * <code>SerialArray</code> object
* @throws SerialException if an error occurs * @throws SerialException if an error occurs;
*/ * if {@code free} had previously been called on this object
*/
public String getBaseTypeName() throws SerialException { public String getBaseTypeName() throws SerialException {
isValid();
return baseTypeName; return baseTypeName;
} }
@ -434,11 +449,13 @@ public class SerialArray implements Array, Serializable, Cloneable {
* @return a <code>ResultSet</code> object containing the designated * @return a <code>ResultSet</code> object containing the designated
* elements in this <code>SerialArray</code> object, with a * elements in this <code>SerialArray</code> object, with a
* separate row for each element * separate row for each element
* @throws SerialException, which in turn throws an * @throws SerialException if called with the cause set to
* <code>UnsupportedOperationException</code>, if this method is called * {@code UnsupportedOperationException}
*/ */
public ResultSet getResultSet(long index, int count) throws SerialException { public ResultSet getResultSet(long index, int count) throws SerialException {
throw new UnsupportedOperationException(); SerialException se = new SerialException();
se.initCause(new UnsupportedOperationException());
throw se;
} }
/** /**
@ -461,13 +478,15 @@ public class SerialArray implements Array, Serializable, Cloneable {
* @return a <code>ResultSet</code> object containing all of the * @return a <code>ResultSet</code> object containing all of the
* elements in this <code>SerialArray</code> object, with a * elements in this <code>SerialArray</code> object, with a
* separate row for each element * separate row for each element
* @throws SerialException, which in turn throws an * @throws SerialException if called with the cause set to
* <code>UnsupportedOperationException</code>, if this method is called * {@code UnsupportedOperationException}
*/ */
public ResultSet getResultSet(Map<String, Class<?>> map) public ResultSet getResultSet(Map<String, Class<?>> map)
throws SerialException throws SerialException
{ {
throw new UnsupportedOperationException(); SerialException se = new SerialException();
se.initCause(new UnsupportedOperationException());
throw se;
} }
/** /**
@ -480,11 +499,13 @@ public class SerialArray implements Array, Serializable, Cloneable {
* @return a <code>ResultSet</code> object containing all of the * @return a <code>ResultSet</code> object containing all of the
* elements in this <code>SerialArray</code> object, with a * elements in this <code>SerialArray</code> object, with a
* separate row for each element * separate row for each element
* @throws SerialException if called, which in turn throws an * @throws SerialException if called with the cause set to
* <code>UnsupportedOperationException</code>, if this method is called * {@code UnsupportedOperationException}
*/ */
public ResultSet getResultSet() throws SerialException { public ResultSet getResultSet() throws SerialException {
throw new UnsupportedOperationException(); SerialException se = new SerialException();
se.initCause(new UnsupportedOperationException());
throw se;
} }
@ -514,16 +535,19 @@ public class SerialArray implements Array, Serializable, Cloneable {
* @return a <code>ResultSet</code> object containing the designated * @return a <code>ResultSet</code> object containing the designated
* elements in this <code>SerialArray</code> object, with a * elements in this <code>SerialArray</code> object, with a
* separate row for each element * separate row for each element
* @throws SerialException if called, which in turn throws an * @throws SerialException if called with the cause set to
* <code>UnsupportedOperationException</code> * {@code UnsupportedOperationException}
*/ */
public ResultSet getResultSet(long index, int count, public ResultSet getResultSet(long index, int count,
Map<String,Class<?>> map) Map<String,Class<?>> map)
throws SerialException throws SerialException
{ {
throw new UnsupportedOperationException(); SerialException se = new SerialException();
se.initCause(new UnsupportedOperationException());
throw se;
} }
/** /**
* Compares this SerialArray to the specified object. The result is {@code * Compares this SerialArray to the specified object. The result is {@code
* true} if and only if the argument is not {@code null} and is a {@code * true} if and only if the argument is not {@code null} and is a {@code
@ -566,12 +590,12 @@ public class SerialArray implements Array, Serializable, Cloneable {
* reference to a clone of the underlying objects array, not a reference * reference to a clone of the underlying objects array, not a reference
* to the original underlying object array of this {@code SerialArray} object. * to the original underlying object array of this {@code SerialArray} object.
* *
* @return a clone of this SerialArray * @return a clone of this SerialArray
*/ */
public Object clone() { public Object clone() {
try { try {
SerialArray sa = (SerialArray) super.clone(); SerialArray sa = (SerialArray) super.clone();
sa.elements = Arrays.copyOf(elements, len); sa.elements = (elements != null) ? Arrays.copyOf(elements, len) : null;
return sa; return sa;
} catch (CloneNotSupportedException ex) { } catch (CloneNotSupportedException ex) {
// this shouldn't happen, since we are Cloneable // this shouldn't happen, since we are Cloneable
@ -615,6 +639,19 @@ public class SerialArray implements Array, Serializable, Cloneable {
s.writeFields(); s.writeFields();
} }
/**
* Check to see if this object had previously had its {@code free} method
* called
*
* @throws SerialException
*/
private void isValid() throws SerialException {
if (elements == null) {
throw new SerialException("Error: You cannot call a method on a "
+ "SerialArray instance once free() has been called.");
}
}
/** /**
* The identifier that assists in the serialization of this <code>SerialArray</code> * The identifier that assists in the serialization of this <code>SerialArray</code>
* object. * object.

View File

@ -51,6 +51,12 @@ import java.util.Arrays;
* <code>Blob</code> object within a <code>SerialBlob</code> object * <code>Blob</code> object within a <code>SerialBlob</code> object
* and to update or truncate a <code>Blob</code> object. * and to update or truncate a <code>Blob</code> object.
* *
* <h4> Thread safety </h4>
*
* <p> A SerialBlob is not safe for use by multiple concurrent threads. If a
* SerialBlob is to be used by more than one thread then access to the SerialBlob
* should be controlled by appropriate synchronization.
*
* @author Jonathan Bruce * @author Jonathan Bruce
*/ */
public class SerialBlob implements Blob, Serializable, Cloneable { public class SerialBlob implements Blob, Serializable, Cloneable {
@ -76,7 +82,7 @@ public class SerialBlob implements Blob, Serializable, Cloneable {
private long len; private long len;
/** /**
* The orginal number of bytes in this <code>SerialBlob</code> object's * The original number of bytes in this <code>SerialBlob</code> object's
* array of bytes when it was first established. * array of bytes when it was first established.
* @serial * @serial
*/ */
@ -160,9 +166,11 @@ public class SerialBlob implements Blob, Serializable, Cloneable {
* @return an array of bytes that is a copy of a region of this * @return an array of bytes that is a copy of a region of this
* <code>SerialBlob</code> object, starting at the given * <code>SerialBlob</code> object, starting at the given
* position and containing the given number of consecutive bytes * position and containing the given number of consecutive bytes
* @throws SerialException if the given starting position is out of bounds * @throws SerialException if the given starting position is out of bounds;
* if {@code free} had previously been called on this object
*/ */
public byte[] getBytes(long pos, int length) throws SerialException { public byte[] getBytes(long pos, int length) throws SerialException {
isValid();
if (length > len) { if (length > len) {
length = (int)len; length = (int)len;
} }
@ -189,9 +197,11 @@ public class SerialBlob implements Blob, Serializable, Cloneable {
* *
* @return a <code>long</code> indicating the length in bytes of this * @return a <code>long</code> indicating the length in bytes of this
* <code>SerialBlob</code> object's array of bytes * <code>SerialBlob</code> object's array of bytes
* @throws SerialException if an error occurs * @throws SerialException if an error occurs;
* if {@code free} had previously been called on this object
*/ */
public long length() throws SerialException { public long length() throws SerialException {
isValid();
return len; return len;
} }
@ -203,12 +213,14 @@ public class SerialBlob implements Blob, Serializable, Cloneable {
* *
* @return a <code>java.io.InputStream</code> object that contains * @return a <code>java.io.InputStream</code> object that contains
* this <code>SerialBlob</code> object's array of bytes * this <code>SerialBlob</code> object's array of bytes
* @throws SerialException if an error occurs * @throws SerialException if an error occurs;
* if {@code free} had previously been called on this object
* @see #setBinaryStream * @see #setBinaryStream
*/ */
public java.io.InputStream getBinaryStream() throws SerialException { public java.io.InputStream getBinaryStream() throws SerialException {
InputStream stream = new ByteArrayInputStream(buf); isValid();
return stream; InputStream stream = new ByteArrayInputStream(buf);
return stream;
} }
/** /**
@ -227,12 +239,14 @@ public class SerialBlob implements Blob, Serializable, Cloneable {
* position; <code>-1</code> if the pattern is not found * position; <code>-1</code> if the pattern is not found
* or the given starting position is out of bounds; position * or the given starting position is out of bounds; position
* numbering for the return value starts at <code>1</code> * numbering for the return value starts at <code>1</code>
* @throws SerialException if an error occurs when serializing the blob * @throws SerialException if an error occurs when serializing the blob;
* if {@code free} had previously been called on this object
* @throws SQLException if there is an error accessing the <code>BLOB</code> * @throws SQLException if there is an error accessing the <code>BLOB</code>
* value from the database * value from the database
*/ */
public long position(byte[] pattern, long start) public long position(byte[] pattern, long start)
throws SerialException, SQLException { throws SerialException, SQLException {
isValid();
if (start < 1 || start > len) { if (start < 1 || start > len) {
return -1; return -1;
} }
@ -270,12 +284,14 @@ public class SerialBlob implements Blob, Serializable, Cloneable {
* at the specified position; <code>-1</code> if the pattern is * at the specified position; <code>-1</code> if the pattern is
* not found or the given starting position is out of bounds; * not found or the given starting position is out of bounds;
* position numbering for the return value starts at <code>1</code> * position numbering for the return value starts at <code>1</code>
* @throws SerialException if an error occurs when serializing the blob * @throws SerialException if an error occurs when serializing the blob;
* if {@code free} had previously been called on this object
* @throws SQLException if there is an error accessing the <code>BLOB</code> * @throws SQLException if there is an error accessing the <code>BLOB</code>
* value from the database * value from the database
*/ */
public long position(Blob pattern, long start) public long position(Blob pattern, long start)
throws SerialException, SQLException { throws SerialException, SQLException {
isValid();
return position(pattern.getBytes(1, (int)(pattern.length())), start); return position(pattern.getBytes(1, (int)(pattern.length())), start);
} }
@ -293,7 +309,8 @@ public class SerialBlob implements Blob, Serializable, Cloneable {
* @return the number of bytes written * @return the number of bytes written
* @throws SerialException if there is an error accessing the * @throws SerialException if there is an error accessing the
* <code>BLOB</code> value; or if an invalid position is set; if an * <code>BLOB</code> value; or if an invalid position is set; if an
* invalid offset value is set * invalid offset value is set;
* if {@code free} had previously been called on this object
* @throws SQLException if there is an error accessing the <code>BLOB</code> * @throws SQLException if there is an error accessing the <code>BLOB</code>
* value from the database * value from the database
* @see #getBytes * @see #getBytes
@ -328,7 +345,8 @@ public class SerialBlob implements Blob, Serializable, Cloneable {
* <code>BLOB</code> value; if an invalid position is set; if an * <code>BLOB</code> value; if an invalid position is set; if an
* invalid offset value is set; if number of bytes to be written * invalid offset value is set; if number of bytes to be written
* is greater than the <code>SerialBlob</code> length; or the combined * is greater than the <code>SerialBlob</code> length; or the combined
* values of the length and offset is greater than the Blob buffer * values of the length and offset is greater than the Blob buffer;
* if {@code free} had previously been called on this object
* @throws SQLException if there is an error accessing the <code>BLOB</code> * @throws SQLException if there is an error accessing the <code>BLOB</code>
* value from the database. * value from the database.
* @see #getBytes * @see #getBytes
@ -336,6 +354,7 @@ public class SerialBlob implements Blob, Serializable, Cloneable {
public int setBytes(long pos, byte[] bytes, int offset, int length) public int setBytes(long pos, byte[] bytes, int offset, int length)
throws SerialException, SQLException { throws SerialException, SQLException {
isValid();
if (offset < 0 || offset > bytes.length) { if (offset < 0 || offset > bytes.length) {
throw new SerialException("Invalid offset in byte array set"); throw new SerialException("Invalid offset in byte array set");
} }
@ -378,11 +397,13 @@ public class SerialBlob implements Blob, Serializable, Cloneable {
* @throws SQLException if there is an error accessing the * @throws SQLException if there is an error accessing the
* <code>BLOB</code> value * <code>BLOB</code> value
* @throws SerialException if the SerialBlob in not instantiated with a * @throws SerialException if the SerialBlob in not instantiated with a
* <code>Blob</code> object that supports <code>setBinaryStream()</code> * <code>Blob</code> object that supports <code>setBinaryStream()</code>;
* if {@code free} had previously been called on this object
* @see #getBinaryStream * @see #getBinaryStream
*/ */
public java.io.OutputStream setBinaryStream(long pos) public java.io.OutputStream setBinaryStream(long pos)
throws SerialException, SQLException { throws SerialException, SQLException {
isValid();
if (this.blob != null) { if (this.blob != null) {
return this.blob.setBinaryStream(pos); return this.blob.setBinaryStream(pos);
} else { } else {
@ -400,54 +421,75 @@ public class SerialBlob implements Blob, Serializable, Cloneable {
* value that this <code>Blob</code> object represents should be * value that this <code>Blob</code> object represents should be
* truncated * truncated
* @throws SerialException if there is an error accessing the Blob value; * @throws SerialException if there is an error accessing the Blob value;
* or the length to truncate is greater that the SerialBlob length * or the length to truncate is greater that the SerialBlob length;
* if {@code free} had previously been called on this object
*/ */
public void truncate(long length) throws SerialException { public void truncate(long length) throws SerialException {
if (length > len) { isValid();
throw new SerialException if (length > len) {
("Length more than what can be truncated"); throw new SerialException
} else if((int)length == 0) { ("Length more than what can be truncated");
buf = new byte[0]; } else if((int)length == 0) {
len = length; buf = new byte[0];
} else { len = length;
len = length; } else {
buf = this.getBytes(1, (int)len); len = length;
} buf = this.getBytes(1, (int)len);
}
} }
/** /**
* Returns an <code>InputStream</code> object that contains a partial <code>Blob</code> value, * Returns an
* starting with the byte specified by pos, which is length bytes in length. * <code>InputStream</code> object that contains a partial
* {@code Blob} value, starting with the byte specified by pos, which is
* length bytes in length.
* *
* @param pos the offset to the first byte of the partial value to be retrieved. * @param pos the offset to the first byte of the partial value to be
* The first byte in the <code>Blob</code> is at position 1 * retrieved. The first byte in the {@code Blob} is at position 1
* @param length the length in bytes of the partial value to be retrieved * @param length the length in bytes of the partial value to be retrieved
* @return <code>InputStream</code> through which the partial <code>Blob</code> value can be read. * @return
* @throws SQLException if pos is less than 1 or if pos is greater than the number of bytes * <code>InputStream</code> through which the partial {@code Blob} value can
* in the <code>Blob</code> or if pos + length is greater than the number of bytes * be read.
* in the <code>Blob</code> * @throws SQLException if pos is less than 1 or if pos is greater than the
* number of bytes in the {@code Blob} or if pos + length is greater than
* the number of bytes in the {@code Blob}
* @throws SerialException if the {@code free} method had been previously
* called on this object
* *
* @since 1.6 * @since 1.6
*/ */
public InputStream getBinaryStream(long pos,long length) throws SQLException { public InputStream getBinaryStream(long pos, long length) throws SQLException {
throw new java.lang.UnsupportedOperationException("Not supported"); isValid();
if (pos < 1 || pos > this.length()) {
throw new SerialException("Invalid position in BLOB object set");
}
if (length < 1 || length > len - pos + 1) {
throw new SerialException("length is < 1 or pos + length >"
+ "total number of bytes");
}
return new ByteArrayInputStream(buf, (int) pos - 1, (int) length);
} }
/** /**
* This method frees the <code>Blob</code> object and releases the resources that it holds. * This method frees the {@code SeriableBlob} object and releases the
* <code>Blob</code> object. The object is invalid once the <code>free</code> * resources that it holds. The object is invalid once the {@code free}
* method is called. If <code>free</code> is called multiple times, the subsequent * method is called. <p> If {@code free} is called multiple times, the
* calls to <code>free</code> are treated as a no-op. * subsequent calls to {@code free} are treated as a no-op. </P>
* *
* @throws SQLException if an error occurs releasing * @throws SQLException if an error occurs releasing the Blob's resources
* the Blob's resources
* @since 1.6 * @since 1.6
*/ */
public void free() throws SQLException { public void free() throws SQLException {
throw new java.lang.UnsupportedOperationException("Not supported"); if (buf != null) {
buf = null;
if (blob != null) {
blob.free();
}
blob = null;
}
} }
/** /**
@ -494,7 +536,7 @@ public class SerialBlob implements Blob, Serializable, Cloneable {
public Object clone() { public Object clone() {
try { try {
SerialBlob sb = (SerialBlob) super.clone(); SerialBlob sb = (SerialBlob) super.clone();
sb.buf = Arrays.copyOf(buf, (int)len); sb.buf = (buf != null) ? Arrays.copyOf(buf, (int)len) : null;
sb.blob = null; sb.blob = null;
return sb; return sb;
} catch (CloneNotSupportedException ex) { } catch (CloneNotSupportedException ex) {
@ -541,9 +583,21 @@ public class SerialBlob implements Blob, Serializable, Cloneable {
} }
/** /**
* The identifier that assists in the serialization of this <code>SerialBlob</code> * Check to see if this object had previously had its {@code free} method
* object. * called
*
* @throws SerialException
*/ */
private void isValid() throws SerialException {
if (buf == null) {
throw new SerialException("Error: You cannot call a method on a "
+ "SerialBlob instance once free() has been called.");
}
}
/**
* The identifier that assists in the serialization of this
* {@code SerialBlob} object.
*/
static final long serialVersionUID = -8144641928112860441L; static final long serialVersionUID = -8144641928112860441L;
} }

View File

@ -44,6 +44,11 @@ import java.util.Arrays;
* from a <code>SerialClob</code> object or to locate the start of * from a <code>SerialClob</code> object or to locate the start of
* a pattern of characters. * a pattern of characters.
* *
* <h4> Thread safety </h4>
*
* <p> A SerialClob is not safe for use by multiple concurrent threads. If a
* SerialClob is to be used by more than one thread then access to the SerialClob
* should be controlled by appropriate synchronization.
* @author Jonathan Bruce * @author Jonathan Bruce
*/ */
public class SerialClob implements Clob, Serializable, Cloneable { public class SerialClob implements Clob, Serializable, Cloneable {
@ -180,9 +185,11 @@ public class SerialClob implements Clob, Serializable, Cloneable {
* *
* @return a <code>long</code> indicating the length in characters of this * @return a <code>long</code> indicating the length in characters of this
* <code>SerialClob</code> object's array of character * <code>SerialClob</code> object's array of character
* @throws SerialException if an error occurs * @throws SerialException if an error occurs;
* if {@code free} had previously been called on this object
*/ */
public long length() throws SerialException { public long length() throws SerialException {
isValid();
return len; return len;
} }
@ -194,9 +201,11 @@ public class SerialClob implements Clob, Serializable, Cloneable {
* *
* @return a <code>java.io.Reader</code> object containing this * @return a <code>java.io.Reader</code> object containing this
* <code>SerialClob</code> object's data * <code>SerialClob</code> object's data
* @throws SerialException if an error occurs * @throws SerialException if an error occurs;
* if {@code free} had previously been called on this object
*/ */
public java.io.Reader getCharacterStream() throws SerialException { public java.io.Reader getCharacterStream() throws SerialException {
isValid();
return (java.io.Reader) new CharArrayReader(buf); return (java.io.Reader) new CharArrayReader(buf);
} }
@ -210,13 +219,15 @@ public class SerialClob implements Clob, Serializable, Cloneable {
* *
* @return a <code>java.io.InputStream</code> object containing * @return a <code>java.io.InputStream</code> object containing
* this <code>SerialClob</code> object's data * this <code>SerialClob</code> object's data
* @throws SerialException if this <code>SerialClob</code> object was not instantiated * @throws SerialException if this {@code SerialClob} object was not
* with a <code>Clob</code> object * instantiated with a <code>Clob</code> object;
* if {@code free} had previously been called on this object
* @throws SQLException if there is an error accessing the * @throws SQLException if there is an error accessing the
* <code>CLOB</code> value represented by the <code>Clob</code> object that was * <code>CLOB</code> value represented by the <code>Clob</code> object
* used to create this <code>SerialClob</code> object * that was used to create this <code>SerialClob</code> object
*/ */
public java.io.InputStream getAsciiStream() throws SerialException, SQLException { public java.io.InputStream getAsciiStream() throws SerialException, SQLException {
isValid();
if (this.clob != null) { if (this.clob != null) {
return this.clob.getAsciiStream(); return this.clob.getAsciiStream();
} else { } else {
@ -248,12 +259,14 @@ public class SerialClob implements Clob, Serializable, Cloneable {
* this <code>SerialClob</code> object beginning at the * this <code>SerialClob</code> object beginning at the
* given position and containing the specified number of * given position and containing the specified number of
* consecutive characters * consecutive characters
* @throws SerialException if either of the arguments is out of bounds * @throws SerialException if either of the arguments is out of bounds;
* if {@code free} had previously been called on this object
*/ */
public String getSubString(long pos, int length) throws SerialException { public String getSubString(long pos, int length) throws SerialException {
isValid();
if (pos < 1 || pos > this.length()) { if (pos < 1 || pos > this.length()) {
throw new SerialException("Invalid position in BLOB object set"); throw new SerialException("Invalid position in SerialClob object set");
} }
if ((pos-1) + length > this.length()) { if ((pos-1) + length > this.length()) {
@ -287,13 +300,14 @@ public class SerialClob implements Clob, Serializable, Cloneable {
* <code>-1</code> if the given <code>String</code> object is * <code>-1</code> if the given <code>String</code> object is
* not found or the starting position is out of bounds; position * not found or the starting position is out of bounds; position
* numbering for the return value starts at <code>1</code> * numbering for the return value starts at <code>1</code>
* @throws SerialException if an error occurs locating the String signature * @throws SerialException if the {@code free} method had been
* @throws SQLException if there is an error accessing the Blob value * previously called on this object
* @throws SQLException if there is an error accessing the Clob value
* from the database. * from the database.
*/ */
public long position(String searchStr, long start) public long position(String searchStr, long start)
throws SerialException, SQLException { throws SerialException, SQLException {
isValid();
if (start < 1 || start > len) { if (start < 1 || start > len) {
return -1; return -1;
} }
@ -332,13 +346,14 @@ public class SerialClob implements Clob, Serializable, Cloneable {
* @return the position at which the given <code>Clob</code> * @return the position at which the given <code>Clob</code>
* object begins in this <code>SerialClob</code> object, * object begins in this <code>SerialClob</code> object,
* at or after the specified starting position * at or after the specified starting position
* @throws SerialException if an error occurs locating the Clob signature * @throws SerialException if an error occurs locating the Clob signature;
* @throws SQLException if there is an error accessing the Blob value * if the {@code free} method had been previously called on this object
* @throws SQLException if there is an error accessing the Clob value
* from the database * from the database
*/ */
public long position(Clob searchStr, long start) public long position(Clob searchStr, long start)
throws SerialException, SQLException { throws SerialException, SQLException {
isValid();
return position(searchStr.getSubString(1,(int)searchStr.length()), start); return position(searchStr.getSubString(1,(int)searchStr.length()), start);
} }
@ -358,7 +373,8 @@ public class SerialClob implements Clob, Serializable, Cloneable {
* <code>CLOB</code> value; if an invalid position is set; if an * <code>CLOB</code> value; if an invalid position is set; if an
* invalid offset value is set; if number of bytes to be written * invalid offset value is set; if number of bytes to be written
* is greater than the <code>SerialClob</code> length; or the combined * is greater than the <code>SerialClob</code> length; or the combined
* values of the length and offset is greater than the Clob buffer * values of the length and offset is greater than the Clob buffer;
* if the {@code free} method had been previously called on this object
*/ */
public int setString(long pos, String str) throws SerialException { public int setString(long pos, String str) throws SerialException {
return (setString(pos, str, 0, str.length())); return (setString(pos, str, 0, str.length()));
@ -383,10 +399,12 @@ public class SerialClob implements Clob, Serializable, Cloneable {
* <code>CLOB</code> value; if an invalid position is set; if an * <code>CLOB</code> value; if an invalid position is set; if an
* invalid offset value is set; if number of bytes to be written * invalid offset value is set; if number of bytes to be written
* is greater than the <code>SerialClob</code> length; or the combined * is greater than the <code>SerialClob</code> length; or the combined
* values of the length and offset is greater than the Clob buffer * values of the length and offset is greater than the Clob buffer;
* if the {@code free} method had been previously called on this object
*/ */
public int setString(long pos, String str, int offset, int length) public int setString(long pos, String str, int offset, int length)
throws SerialException { throws SerialException {
isValid();
String temp = str.substring(offset); String temp = str.substring(offset);
char cPattern[] = temp.toCharArray(); char cPattern[] = temp.toCharArray();
@ -395,7 +413,7 @@ public class SerialClob implements Clob, Serializable, Cloneable {
} }
if (pos < 1 || pos > this.length()) { if (pos < 1 || pos > this.length()) {
throw new SerialException("Invalid position in BLOB object set"); throw new SerialException("Invalid position in Clob object set");
} }
if ((long)(length) > origLen) { if ((long)(length) > origLen) {
@ -430,13 +448,15 @@ public class SerialClob implements Clob, Serializable, Cloneable {
* <code>CLOB</code> object * <code>CLOB</code> object
* @return the stream to which ASCII encoded characters can be written * @return the stream to which ASCII encoded characters can be written
* @throws SerialException if SerialClob is not instantiated with a * @throws SerialException if SerialClob is not instantiated with a
* Clob object that supports <code>setAsciiStream</code> * Clob object;
* if the {@code free} method had been previously called on this object
* @throws SQLException if there is an error accessing the * @throws SQLException if there is an error accessing the
* <code>CLOB</code> value * <code>CLOB</code> value
* @see #getAsciiStream * @see #getAsciiStream
*/ */
public java.io.OutputStream setAsciiStream(long pos) public java.io.OutputStream setAsciiStream(long pos)
throws SerialException, SQLException { throws SerialException, SQLException {
isValid();
if (this.clob != null) { if (this.clob != null) {
return this.clob.setAsciiStream(pos); return this.clob.setAsciiStream(pos);
} else { } else {
@ -460,13 +480,15 @@ public class SerialClob implements Clob, Serializable, Cloneable {
* *
* @return a stream to which Unicode encoded characters can be written * @return a stream to which Unicode encoded characters can be written
* @throws SerialException if the SerialClob is not instantiated with * @throws SerialException if the SerialClob is not instantiated with
* a Clob object that supports <code>setCharacterStream</code> * a Clob object;
* if the {@code free} method had been previously called on this object
* @throws SQLException if there is an error accessing the * @throws SQLException if there is an error accessing the
* <code>CLOB</code> value * <code>CLOB</code> value
* @see #getCharacterStream * @see #getCharacterStream
*/ */
public java.io.Writer setCharacterStream(long pos) public java.io.Writer setCharacterStream(long pos)
throws SerialException, SQLException { throws SerialException, SQLException {
isValid();
if (this.clob != null) { if (this.clob != null) {
return this.clob.setCharacterStream(pos); return this.clob.setCharacterStream(pos);
} else { } else {
@ -486,33 +508,80 @@ public class SerialClob implements Clob, Serializable, Cloneable {
* *
* @param length the length, in bytes, to which the <code>CLOB</code> * @param length the length, in bytes, to which the <code>CLOB</code>
* value should be truncated * value should be truncated
* @throws SQLException if there is an error accessing the * @throws SerialLException if there is an error accessing the
* <code>CLOB</code> value * <code>CLOB</code> value;
* if the {@code free} method had been previously called on this object
*/ */
public void truncate(long length) throws SerialException { public void truncate(long length) throws SerialException {
if (length > len) { isValid();
throw new SerialException if (length > len) {
("Length more than what can be truncated"); throw new SerialException
} else { ("Length more than what can be truncated");
len = length; } else {
// re-size the buffer len = length;
// re-size the buffer
if (len == 0) { if (len == 0) {
buf = new char[] {}; buf = new char[] {};
} else { } else {
buf = (this.getSubString(1, (int)len)).toCharArray(); buf = (this.getSubString(1, (int)len)).toCharArray();
} }
}
}
} }
/**
* Returns a {@code Reader} object that contains a partial
* {@code SerialClob} value, starting
* with the character specified by pos, which is length characters in length.
*
* @param pos the offset to the first character of the partial value to
* be retrieved. The first character in the {@code SerialClob} is at position 1.
* @param length the length in characters of the partial value to be retrieved.
* @return {@code Reader} through which the partial {@code SerialClob}
* value can be read.
* @throws SQLException if pos is less than 1 or if pos is greater than the
* number of characters in the {@code SerialClob} or if pos + length
* is greater than the number of characters in the {@code SerialClob};
* @throws SerialException if the {@code free} method had been previously
* called on this object
* @since 1.6
*/
public Reader getCharacterStream(long pos, long length) throws SQLException { public Reader getCharacterStream(long pos, long length) throws SQLException {
throw new java.lang.UnsupportedOperationException("Not supported"); isValid();
if (pos < 1 || pos > len) {
throw new SerialException("Invalid position in Clob object set");
}
if ((pos-1) + length > len) {
throw new SerialException("Invalid position and substring length");
}
if (length <= 0) {
throw new SerialException("Invalid length specified");
}
return new CharArrayReader(buf, (int)pos, (int)length);
} }
/**
* This method frees the {@code SeriableClob} object and releases the
* resources that it holds.
* The object is invalid once the {@code free} method is called.
* <p>
* If {@code free} is called multiple times, the subsequent
* calls to {@code free} are treated as a no-op.
* </P>
* @throws SQLException if an error occurs releasing
* the Clob's resources
* @since 1.6
*/
public void free() throws SQLException { public void free() throws SQLException {
throw new java.lang.UnsupportedOperationException("Not supported"); if (buf != null) {
buf = null;
if (clob != null) {
clob.free();
}
clob = null;
}
} }
/** /**
@ -559,7 +628,7 @@ public class SerialClob implements Clob, Serializable, Cloneable {
public Object clone() { public Object clone() {
try { try {
SerialClob sc = (SerialClob) super.clone(); SerialClob sc = (SerialClob) super.clone();
sc.buf = Arrays.copyOf(buf, (int)len); sc.buf = (buf != null) ? Arrays.copyOf(buf, (int)len) : null;
sc.clob = null; sc.clob = null;
return sc; return sc;
} catch (CloneNotSupportedException ex) { } catch (CloneNotSupportedException ex) {
@ -605,7 +674,20 @@ public class SerialClob implements Clob, Serializable, Cloneable {
} }
/** /**
* The identifier that assists in the serialization of this <code>SerialClob</code> * Check to see if this object had previously had its {@code free} method
* called
*
* @throws SerialException
*/
private void isValid() throws SerialException {
if (buf == null) {
throw new SerialException("Error: You cannot call a method on a "
+ "SerialClob instance once free() has been called.");
}
}
/**
* The identifier that assists in the serialization of this {@code SerialClob}
* object. * object.
*/ */
static final long serialVersionUID = -1662519690087375313L; static final long serialVersionUID = -1662519690087375313L;

View File

@ -42,6 +42,12 @@ import java.net.URL;
* <pre> * <pre>
* java.net.URL url = rowset.getURL(1); * java.net.URL url = rowset.getURL(1);
* </pre> * </pre>
*
* <h4> Thread safety </h4>
*
* A SerialDatalink is not safe for use by multiple concurrent threads. If a
* SerialDatalink is to be used by more than one thread then access to the
* SerialDatalink should be controlled by appropriate synchronization.
*/ */
public class SerialDatalink implements Serializable, Cloneable { public class SerialDatalink implements Serializable, Cloneable {

View File

@ -44,6 +44,12 @@ import javax.sql.rowset.RowSetWarning;
* Static or transient fields cannot be serialized; an attempt to serialize * Static or transient fields cannot be serialized; an attempt to serialize
* them will result in a <code>SerialException</code> object being thrown. * them will result in a <code>SerialException</code> object being thrown.
* *
* <h4> Thread safety </h4>
*
* A SerialJavaObject is not safe for use by multiple concurrent threads. If a
* SerialJavaObject is to be used by more than one thread then access to the
* SerialJavaObject should be controlled by appropriate synchronization.
*
* @author Jonathan Bruce * @author Jonathan Bruce
*/ */
public class SerialJavaObject implements Serializable, Cloneable { public class SerialJavaObject implements Serializable, Cloneable {

View File

@ -36,6 +36,13 @@ import java.util.*;
* The <code>SerialRef</code> class provides a constructor for * The <code>SerialRef</code> class provides a constructor for
* creating a <code>SerialRef</code> instance from a <code>Ref</code> * creating a <code>SerialRef</code> instance from a <code>Ref</code>
* object and provides methods for getting and setting the <code>Ref</code> object. * object and provides methods for getting and setting the <code>Ref</code> object.
*
* <h4> Thread safety </h4>
*
* A SerialRef is not safe for use by multiple concurrent threads. If a
* SerialRef is to be used by more than one thread then access to the SerialRef
* should be controlled by appropriate synchronization.
*
*/ */
public class SerialRef implements Ref, Serializable, Cloneable { public class SerialRef implements Ref, Serializable, Cloneable {

View File

@ -50,6 +50,13 @@ import javax.sql.rowset.*;
* an instance from a <code>Struct</code> object, a method for retrieving * an instance from a <code>Struct</code> object, a method for retrieving
* the SQL type name of the SQL structured type in the database, and methods * the SQL type name of the SQL structured type in the database, and methods
* for retrieving its attribute values. * for retrieving its attribute values.
*
* <h4> Thread safety </h4>
*
* A SerialStruct is not safe for use by multiple concurrent threads. If a
* SerialStruct is to be used by more than one thread then access to the
* SerialStruct should be controlled by appropriate synchronization.
*
*/ */
public class SerialStruct implements Struct, Serializable, Cloneable { public class SerialStruct implements Struct, Serializable, Cloneable {

View File

@ -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;

View File

@ -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 {
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();

View File

@ -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 {
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 {
// 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 {
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,37 +253,16 @@ public class Krb5Util {
} }
public KerberosKey[] getKKeys() { public KerberosKey[] getKKeys() {
if (ktabs.isEmpty()) { List<KerberosKey> keys = new ArrayList<>();
return kk.toArray(new KerberosKey[kk.size()]); for (KerberosKey k: kk) {
} else { keys.add(k);
List<KerberosKey> keys = new ArrayList<>();
for (KeyTab ktab: ktabs) {
for (KerberosKey k: ktab.getKeys(kp)) {
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()]);
} }
for (KeyTab ktab: ktabs) {
for (KerberosKey k: ktab.getKeys(kp)) {
keys.add(k);
}
}
return keys.toArray(new KerberosKey[keys.size()]);
} }
public EncryptionKey[] getEKeys() { public EncryptionKey[] getEKeys() {

View File

@ -90,10 +90,6 @@ public final class SunNativeProvider extends Provider {
"libgssapi_krb5.so", "libgssapi_krb5.so",
"libgssapi_krb5.so.2", "libgssapi_krb5.so.2",
}; };
} else if (osname.contains("OS X")) {
gssLibs = new String[]{
"/usr/lib/sasl2/libgssapiv2.2.so",
};
} }
} else { } else {
gssLibs = new String[]{ defaultLib }; gssLibs = new String[]{ defaultLib };

View File

@ -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 {
"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 {
} }
}, },
{ "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

View File

@ -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

View File

@ -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 {
"\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.",

View File

@ -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.",

View File

@ -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 {
"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

View File

@ -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

View File

@ -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

View File

@ -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.",

View File

@ -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

View File

@ -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

View File

@ -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.",

View File

@ -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 {
"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 {
"ip." // pm marker "ip." // pm marker
} }
}, },
{ "narrow.AmPmMarkers",
new String[] {
"ap.",
"ip.",
}
},
}; };
} }
} }

View File

@ -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",

View File

@ -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

View File

@ -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 {
"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

View File

@ -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

View File

@ -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 {
"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

View File

@ -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",

View File

@ -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",

View File

@ -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

View File

@ -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

View File

@ -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 {
"\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.",

View File

@ -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",

View File

@ -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.",

View File

@ -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 {
"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",

View File

@ -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",

View File

@ -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.",

View File

@ -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.",

View File

@ -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

View File

@ -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 {
"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.",

View File

@ -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.",

View File

@ -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.",

View File

@ -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.",

View File

@ -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

View File

@ -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.###",

View File

@ -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 {
"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

View File

@ -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 {
"\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 {
"\u0e04.\u0e28." "\u0e04.\u0e28."
} }
}, },
{ "narrow.Eras",
new String[] {
"\u0e01\u0e48\u0e2d\u0e19 \u0e04.\u0e28.",
"\u0e04.\u0e28.",
}
},
{ "buddhist.TimePatterns", { "buddhist.TimePatterns",
timePatterns timePatterns
}, },

View File

@ -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 {
"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

View File

@ -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.",

View File

@ -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

View File

@ -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 {
"\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

View File

@ -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");

View File

@ -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;

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