8229960: Remove sun.nio.cs.map system property

Reviewed-by: alanb
This commit is contained in:
Naoto Sato 2019-09-10 12:51:05 -07:00
parent 7c2fe7025b
commit 28b972e5ce
12 changed files with 9 additions and 9829 deletions

View File

@ -592,9 +592,6 @@ charset x-mswin-936 MS936
alias ms936 # JDK historical
alias ms_936 // IANA aliases
# The definition of this charset may be overridden by the init method,
# below, if the sun.nio.cs.map property is defined.
#
charset Shift_JIS SJIS
package sun.nio.cs.ext
type dbcs
@ -609,8 +606,6 @@ charset Shift_JIS SJIS
alias x-sjis
alias csShiftJIS
# The definition of this charset may be overridden by the init method,
# below, if the sun.nio.cs.map property is defined.
charset windows-31j MS932
package sun.nio.cs.ext
type dbcs

View File

@ -25,4 +25,4 @@ JIS_X_0212
JIS_X_0208_Solaris
JIS_X_0212_Solaris
MS932
SJIS # SJIS must go together with MS932 to support sun.nio.cs.map
SJIS

View File

@ -8,8 +8,8 @@ MS1256
MS1258
MS874
MS932
JIS_X_0201 # JIS_X_0201 is used by MS932 in its contains() method
SJIS # SJIS must go together with MS932 to support sun.nio.cs.map
JIS_X_0201
SJIS
MS936
MS949
MS950

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@ -35,7 +35,6 @@ import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import jdk.internal.vm.annotation.Stable;
import sun.security.action.GetPropertyAction;
public class StandardCharsets extends CharsetProvider {
@ -120,8 +119,6 @@ public class StandardCharsets extends CharsetProvider {
}
private Charset lookup(String charsetName) {
init();
// By checking these built-ins we can avoid initializing Aliases,
// Classes and Cache eagerly during bootstrap.
//
@ -177,7 +174,6 @@ public class StandardCharsets extends CharsetProvider {
public final Iterator<Charset> charsets() {
Set<String> charsetNames;
synchronized (this) {
init();
// Ensure initialized in synchronized block
charsetNames = classMap().keySet();
aliasMap();
@ -202,53 +198,4 @@ public class StandardCharsets extends CharsetProvider {
};
}
private boolean initialized = false;
/* provider the sun.nio.cs.map property fir sjis/ms932 mapping hack
*/
private void init() {
if (initialized)
return;
if (!jdk.internal.misc.VM.isBooted())
return;
initialized = true;
String map = GetPropertyAction.privilegedGetProperty("sun.nio.cs.map");
if (map != null) {
Map<String,String> aliasMap = aliasMap();
Map<String,String> classMap = classMap();
String[] maps = map.split(",");
for (int i = 0; i < maps.length; i++) {
if (maps[i].equalsIgnoreCase("Windows-31J/Shift_JIS")) {
// if we dont have both sjis and ms932, do nothing
if (classMap.get("shift_jis") == null ||
classMap.get("windows-31j") == null) {
break;
}
aliases_MS932 = new String[] {
"MS932", // JDK historical
"windows-932",
"csWindows31J",
"shift-jis",
"ms_kanji",
"x-sjis",
"csShiftJIS",
// This alias takes precedence over the actual
// Shift_JIS charset itself since aliases are always
// resolved first, before looking up canonical names.
"shift_jis"
};
aliases_SJIS = new String[] { "sjis" };
for (String alias : aliases_MS932) {
aliasMap.put(toLower(alias), "windows-31j");
}
cache().put("shift_jis", null);
break;
}
}
}
}
}

View File

@ -105,7 +105,6 @@ grant codeBase "jrt:/jdk.accessibility" {
grant codeBase "jrt:/jdk.charsets" {
permission java.util.PropertyPermission "os.name", "read";
permission java.util.PropertyPermission "sun.nio.cs.map", "read";
permission java.lang.RuntimePermission "charsetProvider";
permission java.lang.RuntimePermission
"accessClassInPackage.jdk.internal.misc";

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@ -29,11 +29,8 @@
package sun.nio.cs.ext;
import java.lang.ref.SoftReference;
import java.nio.charset.Charset;
import java.nio.charset.spi.CharsetProvider;
import java.security.AccessController;
import java.security.PrivilegedAction;
/**
* Provider for extended charsets.
@ -53,188 +50,6 @@ public class ExtendedCharsets extends AbstractCharsetProvider {
}
private boolean initialized = false;
// If the sun.nio.cs.map property is defined on the command line we won't
// see it in the system-properties table until after the charset subsystem
// has been initialized. We therefore delay the effect of this property
// until after the JRE has completely booted.
//
// At the moment following values for this property are supported, property
// value string is case insensitive.
//
// (1)"Windows-31J/Shift_JIS"
// In 1.4.1 we added a correct implementation of the Shift_JIS charset
// but in previous releases this charset name had been treated as an alias
// for Windows-31J, aka MS932. Users who have existing code that depends
// upon this alias can restore the previous behavior by defining this
// property to have this value.
//
// (2)"x-windows-50221/ISO-2022-JP"
// "x-windows-50220/ISO-2022-JP"
// "x-windows-iso2022jp/ISO-2022-JP"
// The charset ISO-2022-JP is a "standard based" implementation by default,
// which supports ASCII, JIS_X_0201 and JIS_X_0208 mappings based encoding
// and decoding only.
// There are three Microsoft iso-2022-jp variants, namely x-windows-50220,
// x-windows-50221 and x-windows-iso2022jp which behaves "slightly" differently
// compared to the "standard based" implementation. See ISO2022_JP.java for
// detailed description. Users who prefer the behavior of MS iso-2022-jp
// variants should use these names explicitly instead of using "ISO-2022-JP"
// and its aliases. However for those who need the ISO-2022-JP charset behaves
// exactly the same as MS variants do, above properties can be defined to
// switch.
//
// If we need to define other charset-alias mappings in the future then
// this property could be further extended, the general idea being that its
// value should be of the form
//
// new-charset-1/old-charset-1,new-charset-2/old-charset-2,...
//
// where each charset named to the left of a slash is intended to replace
// (most) uses of the charset named to the right of the slash.
//
protected void init() {
if (initialized)
return;
if (!jdk.internal.misc.VM.isBooted())
return;
String map = getProperty("sun.nio.cs.map");
boolean sjisIsMS932 = false;
boolean iso2022jpIsMS50221 = false;
boolean iso2022jpIsMS50220 = false;
boolean iso2022jpIsMSISO2022JP = false;
if (map != null) {
String[] maps = map.split(",");
for (int i = 0; i < maps.length; i++) {
if (maps[i].equalsIgnoreCase("Windows-31J/Shift_JIS")) {
sjisIsMS932 = true;
} else if (maps[i].equalsIgnoreCase("x-windows-50221/ISO-2022-JP")) {
iso2022jpIsMS50221 = true;
} else if (maps[i].equalsIgnoreCase("x-windows-50220/ISO-2022-JP")) {
iso2022jpIsMS50220 = true;
} else if (maps[i].equalsIgnoreCase("x-windows-iso2022jp/ISO-2022-JP")) {
iso2022jpIsMSISO2022JP = true;
}
}
}
if (sjisIsMS932 && hasCharset("Shift_JIS")) {
deleteCharset("Shift_JIS",
new String[] {
// IANA aliases
"sjis", // historical
"shift_jis",
"shift-jis",
"ms_kanji",
"x-sjis",
"csShiftJIS"
});
deleteCharset("windows-31j",
new String[] {
"MS932", // JDK historical
"windows-932",
"csWindows31J"
});
charset("Shift_JIS", "SJIS",
new String[] {
// IANA aliases
"sjis" // JDK historical
});
charset("windows-31j", "MS932",
new String[] {
"MS932", // JDK historical
"windows-932",
"csWindows31J",
"shift-jis",
"ms_kanji",
"x-sjis",
"csShiftJIS",
// This alias takes precedence over the actual
// Shift_JIS charset itself since aliases are always
// resolved first, before looking up canonical names.
"shift_jis"
});
}
if (iso2022jpIsMS50221 ||
iso2022jpIsMS50220 ||
iso2022jpIsMSISO2022JP) {
deleteCharset("ISO-2022-JP",
new String[] {
"iso2022jp",
"jis",
"csISO2022JP",
"jis_encoding",
"csjisencoding"
});
if (iso2022jpIsMS50221) {
deleteCharset("x-windows-50221",
new String[] {
"cp50221",
"ms50221"
});
charset("x-windows-50221", "MS50221",
new String[] {
"cp50221",
"ms50221",
"iso-2022-jp",
"iso2022jp",
"jis",
"csISO2022JP",
"jis_encoding",
"csjisencoding"
});
} else if (iso2022jpIsMS50220) {
deleteCharset("x-windows-50220",
new String[] {
"cp50220",
"ms50220"
});
charset("x-windows-50220", "MS50220",
new String[] {
"cp50220",
"ms50220",
"iso-2022-jp",
"iso2022jp",
"jis",
"csISO2022JP",
"jis_encoding",
"csjisencoding"
});
} else {
deleteCharset("x-windows-iso2022jp",
new String[] {
"windows-iso2022jp"
});
charset("x-windows-iso2022jp", "MSISO2022JP",
new String[] {
"windows-iso2022jp",
"iso-2022-jp",
"iso2022jp",
"jis",
"csISO2022JP",
"jis_encoding",
"csjisencoding"
});
}
}
initialized = true;
}
private static String getProperty(String key) {
// this method may be called during initialization of
// system class loader and thus not using lambda
return AccessController.doPrivileged(
new PrivilegedAction<String>() {
@Override
public String run() {
return System.getProperty(key);
}
});
}
public static String[] aliasesFor(String charsetName) {
if (instance == null)
return null;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 2019 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
@ -22,13 +22,12 @@
*/
/* @test
* @bug 4712786
* @bug 4712786 8229960
* @summary Check charsets against reference files
* @modules jdk.charsets
*
* @build Util
* @run main Check shift_jis ref.shift_jis
* @run main/othervm -Dsun.nio.cs.map=Windows-31J/Shift_JIS Check shift_jis ref.windows-31j
*/
import java.io.*;

View File

@ -1,92 +0,0 @@
/*
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 4879123
* @summary Verify that sun.nio.cs.map property interpreted in ja multibyte locales
* @requires (os.family != "windows")
* @modules jdk.charsets
* @library /test/lib
* @build jdk.test.lib.Utils
* jdk.test.lib.Asserts
* jdk.test.lib.JDKToolFinder
* jdk.test.lib.JDKToolLauncher
* jdk.test.lib.Platform
* jdk.test.lib.process.*
* SJISPropTest
* @run testng SJISMappingPropTest
*/
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
public class SJISMappingPropTest {
@DataProvider
public static Iterator<Object[]> locales() {
List<Object[]> data = new ArrayList<>();
data.add(new String[]{"ja"});
data.add(new String[]{"ja_JP.PCK"});
data.add(new String[]{"ja_JP.eucJP"});
return data.iterator();
}
@Test(dataProvider = "locales")
public void testWithProperty(String locale) throws Exception {
// with property set, shift_jis should map to windows-31J charset
runTest(locale,
"-Dsun.nio.cs.map=Windows-31J/Shift_JIS",
SJISPropTest.class.getName(),
"MS932");
}
@Test(dataProvider = "locales")
public void testWithoutProperty(String locale) throws Exception {
// without property set - "shift_jis" follows IANA conventions
// and should map to the sun.nio.cs.ext.Shift_JIS charset
runTest(locale,
SJISPropTest.class.getName(),
"Shift_JIS");
}
private void runTest(String locale, String... cmd) throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, cmd);
Map<String, String> env = pb.environment();
env.put("LC_ALL", locale);
OutputAnalyzer out = ProcessTools.executeProcess(pb)
.outputTo(System.out)
.errorTo(System.err);
assertEquals(out.getExitValue(), 0);
}
}

View File

@ -1,56 +0,0 @@
/*
* Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* Regression test class run by SJISMappingPropTest.java to verify
* that sun.nio.cs.map property is correctly interpreted in
* multibyte Japanese locales
*/
public class SJISPropTest {
public static void main(String[] args) throws Exception {
boolean sjisIsMS932 = false;
if (args[0].equals("MS932"))
sjisIsMS932 = true;
byte[] testBytes = { (byte)0x81, (byte)0x60 };
// JIS X based Shift_JIS and Windows-31J differ
// in a number of mappings including this one.
String expectedMS932 = new String("\uFF5E");
String expectedSJIS = new String("\u301C");
// Alias "shift_jis" will map to Windows-31J
// if the sun.nio.cs.map system property is defined as
// "Windows-31J/Shift_JIS". This should work in all
// multibyte (especially Japanese) locales.
String s = new String(testBytes, "shift_jis");
if (sjisIsMS932 && !s.equals(expectedMS932))
throw new Exception("not MS932");
else if (!sjisIsMS932 && !s.equals(expectedSJIS))
throw new Exception("not SJIS");
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,6 @@
grant codeBase "jrt:/jdk.charsets" {
permission java.io.FilePermission "${java.home}/-", "read";
permission java.util.PropertyPermission "os.name", "read";
permission java.util.PropertyPermission "sun.nio.cs.map", "read";
permission java.lang.RuntimePermission "charsetProvider";
permission java.lang.RuntimePermission "accessClassInPackage.jdk.internal.misc";
permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.cs";

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 2019, 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
@ -22,7 +22,7 @@
*/
/* @test
* @bug 6173388 6319716
* @bug 6173388 6319716 8229960
* @summary Check full coverage encode/decode for Microsoft
* ISO2022_JP variants MS50220, MS50221 and MSISO2022JP
* @modules jdk.charsets
@ -666,23 +666,6 @@ public class TestMS5022X {
}
public static void main(String[] args) throws Exception {
String map = System.getProperty("sun.nio.cs.map");
if (map != null) {
map = map.toLowerCase(java.util.Locale.US);
Charset cs = Charset.forName("ISO-2022-JP");
if (map.indexOf("x-windows-50221/ISO-2022-jp") != -1 &&
!"x-windows-50220".equals(cs.name()) ||
map.indexOf("x-windows-50220/ISO-2022-jp") != -1 &&
!"x-windows-50220".equals(cs.name()) ||
map.indexOf("x-windows-iso2022jp/ISO-2022-jp") != -1 &&
!"x-windows-iso2022jp".equals(cs.name())) {
throw new Exception("Error: sun.nio.cs.map=" + map +
", ISO-2022-JP=" + cs.name());
} else {
System.out.printf("ISO-2022-JP=%s\n", cs.name());
}
}
String testStr = US_ASCII +
JISX0208SUBSET +
JISX0201KATAKANA +