8073924: Update test/java/nio/charset/Charset/NIOCharsetAvailability.java to work with module system
To use module's runtime filesystem to iterate the class files Reviewed-by: alanb
This commit is contained in:
parent
a929976abd
commit
7f950ef63d
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -23,41 +23,63 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* @test
|
* @test
|
||||||
* @bug 4777124 6920545 6911753
|
* @bug 4777124 6920545 6911753 8073924
|
||||||
* @summary Verify that all Charset subclasses are available through the API
|
* @summary Verify that all Charset subclasses are available through the API
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.File;
|
import java.net.URI;
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.security.AccessController;
|
import java.nio.file.FileSystem;
|
||||||
import java.security.PrivilegedAction;
|
import java.nio.file.FileSystems;
|
||||||
import java.util.Collection;
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.Vector;
|
import java.util.stream.Collectors;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.stream.Stream;
|
||||||
import java.util.zip.ZipInputStream;
|
|
||||||
|
|
||||||
|
|
||||||
public class NIOCharsetAvailabilityTest {
|
public class NIOCharsetAvailabilityTest {
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
|
|
||||||
// build the set of all Charset subclasses in the
|
// build the set of all Charset subclasses in the
|
||||||
// two known charset implementation packages
|
// two known charset implementation packages
|
||||||
Set charsets = new HashSet();
|
FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/"));
|
||||||
addCharsets(charsets, "sun.nio.cs");
|
Set<Class> charsets =
|
||||||
addCharsets(charsets, "sun.nio.cs.ext");
|
Stream.concat(Files.walk(fs.getPath("/java.base/sun/nio/cs/")),
|
||||||
|
Files.walk(fs.getPath("/jdk.charsets/sun/nio/cs/ext/")))
|
||||||
|
.map( p -> p.subpath(1, p.getNameCount()).toString())
|
||||||
|
.filter( s -> s.indexOf("$") == -1 && s.endsWith(".class"))
|
||||||
|
.map( s -> {
|
||||||
|
try {
|
||||||
|
return Class.forName(s.substring(0, s.length() - 6)
|
||||||
|
.replace('/', '.'));
|
||||||
|
} catch (Exception x) {
|
||||||
|
throw new RuntimeException(x);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.filter( clz -> {
|
||||||
|
Class superclazz = clz.getSuperclass();
|
||||||
|
while (superclazz != null && !superclazz.equals(Object.class)) {
|
||||||
|
if (superclazz.equals(Charset.class)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
superclazz = superclazz.getSuperclass();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
})
|
||||||
|
.collect(Collectors.toCollection(HashSet::new));
|
||||||
// remove the charsets that the API says are available
|
// remove the charsets that the API says are available
|
||||||
Collection availableCharsets = Charset.availableCharsets().values();
|
Charset.availableCharsets()
|
||||||
Iterator iter = availableCharsets.iterator();
|
.values()
|
||||||
while (iter.hasNext()) {
|
.stream()
|
||||||
charsets.remove(((Charset) iter.next()).getClass());
|
.forEach(cs -> {
|
||||||
}
|
if (!charsets.contains(cs.getClass())) {
|
||||||
|
System.out.println(" missing -> " + cs.getClass());
|
||||||
|
}
|
||||||
|
charsets.remove(cs.getClass());
|
||||||
|
});
|
||||||
|
|
||||||
// remove the known pseudo-charsets that serve only to implement
|
// remove the known pseudo-charsets that serve only to implement
|
||||||
// other charsets, but shouldn't be known to the public
|
// other charsets, but shouldn't be known to the public
|
||||||
@ -76,146 +98,12 @@ public class NIOCharsetAvailabilityTest {
|
|||||||
charsets.remove(Class.forName("sun.nio.cs.JIS_X_0208_Solaris"));
|
charsets.remove(Class.forName("sun.nio.cs.JIS_X_0208_Solaris"));
|
||||||
charsets.remove(Class.forName("sun.nio.cs.JIS_X_0212_Solaris"));
|
charsets.remove(Class.forName("sun.nio.cs.JIS_X_0212_Solaris"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// report the charsets that are implemented but not available
|
// report the charsets that are implemented but not available
|
||||||
iter = charsets.iterator();
|
|
||||||
while (iter.hasNext()) {
|
|
||||||
System.out.println("Unused Charset subclass: " + ((Class) iter.next()).getName());
|
|
||||||
}
|
|
||||||
if (charsets.size() > 0) {
|
if (charsets.size() > 0) {
|
||||||
|
charsets.stream()
|
||||||
|
.forEach( clz ->
|
||||||
|
System.out.println("Unused Charset subclass: " + clz));
|
||||||
throw new RuntimeException();
|
throw new RuntimeException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Vector classPathSegments = new Vector();
|
|
||||||
|
|
||||||
private static void addCharsets(Set charsets, final String packageName)
|
|
||||||
throws Exception {
|
|
||||||
|
|
||||||
String classPath = AccessController.doPrivileged(
|
|
||||||
(PrivilegedAction<String>)() -> System.getProperty("sun.boot.class.path"));
|
|
||||||
String s = AccessController.doPrivileged(
|
|
||||||
(PrivilegedAction<String>)() -> System.getProperty("java.class.path"));
|
|
||||||
|
|
||||||
// Search combined system and application class path
|
|
||||||
if (s != null && s.length() != 0) {
|
|
||||||
classPath += File.pathSeparator + s;
|
|
||||||
}
|
|
||||||
while (classPath != null && classPath.length() != 0) {
|
|
||||||
int i = classPath.lastIndexOf(java.io.File.pathSeparatorChar);
|
|
||||||
String dir = classPath.substring(i + 1);
|
|
||||||
if (i == -1) {
|
|
||||||
classPath = null;
|
|
||||||
} else {
|
|
||||||
classPath = classPath.substring(0, i);
|
|
||||||
}
|
|
||||||
classPathSegments.insertElementAt(dir, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
String[] classList = (String[])
|
|
||||||
java.security.AccessController.doPrivileged(
|
|
||||||
new java.security.PrivilegedAction() {
|
|
||||||
public Object run() {
|
|
||||||
return getClassList(packageName, "");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
for (int i = 0; i < classList.length; i++) {
|
|
||||||
try {
|
|
||||||
Class clazz = Class.forName(packageName + "." + classList[i]);
|
|
||||||
Class superclazz = clazz.getSuperclass();
|
|
||||||
while (superclazz != null && !superclazz.equals(Object.class)) {
|
|
||||||
if (superclazz.equals(Charset.class)) {
|
|
||||||
charsets.add(clazz);
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
superclazz = superclazz.getSuperclass();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final char ZIPSEPARATOR = '/';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Walk through CLASSPATH and find class list from a package.
|
|
||||||
* The class names start with prefix string
|
|
||||||
* @param package name, class name prefix
|
|
||||||
* @return class list in an array of String
|
|
||||||
*/
|
|
||||||
private static String[] getClassList(String pkgName, String prefix) {
|
|
||||||
Vector listBuffer = new Vector();
|
|
||||||
String packagePath = pkgName.replace('.', File.separatorChar)
|
|
||||||
+ File.separatorChar;
|
|
||||||
String zipPackagePath = pkgName.replace('.', ZIPSEPARATOR)
|
|
||||||
+ ZIPSEPARATOR;
|
|
||||||
for (int i = 0; i < classPathSegments.size(); i++){
|
|
||||||
String onePath = (String) classPathSegments.elementAt(i);
|
|
||||||
File f = new File(onePath);
|
|
||||||
if (!f.exists())
|
|
||||||
continue;
|
|
||||||
if (f.isFile())
|
|
||||||
scanFile(f, zipPackagePath, listBuffer, prefix);
|
|
||||||
else if (f.isDirectory()) {
|
|
||||||
String fullPath;
|
|
||||||
if (onePath.endsWith(File.separator))
|
|
||||||
fullPath = onePath + packagePath;
|
|
||||||
else
|
|
||||||
fullPath = onePath + File.separatorChar + packagePath;
|
|
||||||
File dir = new File(fullPath);
|
|
||||||
if (dir.exists() && dir.isDirectory())
|
|
||||||
scanDir(dir, listBuffer, prefix);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String[] classNames = new String[listBuffer.size()];
|
|
||||||
listBuffer.copyInto(classNames);
|
|
||||||
return classNames;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void addClass (String className, Vector listBuffer, String prefix) {
|
|
||||||
if (className != null && className.startsWith(prefix)
|
|
||||||
&& !listBuffer.contains(className))
|
|
||||||
listBuffer.addElement(className);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String midString(String str, String pre, String suf) {
|
|
||||||
String midStr;
|
|
||||||
if (str.startsWith(pre) && str.endsWith(suf))
|
|
||||||
midStr = str.substring(pre.length(), str.length() - suf.length());
|
|
||||||
else
|
|
||||||
midStr = null;
|
|
||||||
return midStr;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void scanDir(File dir, Vector listBuffer, String prefix) {
|
|
||||||
String[] fileList = dir.list();
|
|
||||||
for (int i = 0; i < fileList.length; i++) {
|
|
||||||
addClass(midString(fileList[i], "", ".class"), listBuffer, prefix);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void scanFile(File f, String packagePath, Vector listBuffer,
|
|
||||||
String prefix) {
|
|
||||||
try {
|
|
||||||
ZipInputStream zipFile = new ZipInputStream(new FileInputStream(f));
|
|
||||||
ZipEntry entry;
|
|
||||||
while ((entry = zipFile.getNextEntry()) != null) {
|
|
||||||
String eName = entry.getName();
|
|
||||||
if (eName.startsWith(packagePath)) {
|
|
||||||
if (eName.endsWith(".class")) {
|
|
||||||
addClass(midString(eName, packagePath, ".class"),
|
|
||||||
listBuffer, prefix);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
System.out.println("file not found:" + e);
|
|
||||||
} catch (IOException e) {
|
|
||||||
System.out.println("file IO Exception:" + e);
|
|
||||||
} catch (Exception e) {
|
|
||||||
System.out.println("Exception:" + e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user