8158922: jjs tab completion of Java classes shows package-private, "hidden" classes too
authorsundar
Tue, 07 Jun 2016 19:13:26 +0530
changeset 38897 b92825d7708c
parent 38840 7693aa00e131
child 38898 43383182cae3
8158922: jjs tab completion of Java classes shows package-private, "hidden" classes too Reviewed-by: hannesw, mhaupt
nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Main.java
nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/PackagesHelper.java
nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/PropertiesHelper.java
--- a/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Main.java	Wed Jul 05 21:49:00 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Main.java	Tue Jun 07 19:13:26 2016 +0530
@@ -117,7 +117,7 @@
         final PrintWriter err = context.getErr();
         final Global oldGlobal = Context.getGlobal();
         final boolean globalChanged = (oldGlobal != global);
-        final PropertiesHelper propsHelper = new PropertiesHelper(env._classpath);
+        final PropertiesHelper propsHelper = new PropertiesHelper(context);
         final NashornCompleter completer = new NashornCompleter(context, global, this, propsHelper);
 
         try (final Console in = new Console(System.in, System.out, HIST_FILE, completer,
--- a/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/PackagesHelper.java	Wed Jul 05 21:49:00 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/PackagesHelper.java	Tue Jun 07 19:13:26 2016 +0530
@@ -25,6 +25,7 @@
 
 package jdk.nashorn.tools.jjs;
 
+import java.lang.reflect.Modifier;
 import java.io.IOException;
 import java.io.File;
 import java.net.URI;
@@ -49,6 +50,7 @@
 import javax.tools.StandardJavaFileManager;
 import javax.tools.StandardLocation;
 import javax.tools.ToolProvider;
+import jdk.nashorn.internal.runtime.Context;
 
 /**
  * A helper class to compute properties of a Java package object. Properties of
@@ -72,6 +74,7 @@
         return compiler != null;
     }
 
+    private final Context context;
     private final StandardJavaFileManager fm;
     private final Set<JavaFileObject.Kind> fileKinds;
     private final FileSystem jrtfs;
@@ -79,9 +82,11 @@
     /**
      * Construct a new PackagesHelper.
      *
-     * @param classPath Class path to compute properties of java package objects
+     * @param context the current Nashorn Context
      */
-    PackagesHelper(final String classPath) throws IOException {
+    PackagesHelper(final Context context) throws IOException {
+        this.context = context;
+        final String classPath = context.getEnv()._classpath;
         if (isJavacAvailable()) {
             fm = compiler.getStandardFileManager(null, null, null);
             fileKinds = EnumSet.of(JavaFileObject.Kind.CLASS);
@@ -166,8 +171,11 @@
                                 String str = p.getFileName().toString();
                                 // get rid of ".class", if any
                                 if (str.endsWith(".class")) {
-                                    props.add(str.substring(0, str.length() - ".class".length()));
-                                } else {
+                                    final String clsName = str.substring(0, str.length() - ".class".length());
+                                    if (clsName.indexOf('$') == -1 && isClassAccessible(pkg + "." + clsName)) {
+                                        props.add(str);
+                                    }
+                                } else if (isPackageAccessible(pkg + "." + str)) {
                                     props.add(str);
                                 }
                             }
@@ -193,7 +201,10 @@
 
             if (nextDot != -1) {
                 // subpackage - eg. "regex" for "java.util"
-                props.add(binaryName.substring(start, nextDot));
+                final String pkgName = binaryName.substring(start, nextDot);
+                if (isPackageAccessible(binaryName.substring(0, nextDot))) {
+                    props.add(binaryName.substring(start, nextDot));
+                }
             } else {
                 // class - filter out nested, inner, anonymous, local classes.
                 // Dynalink supported public nested classes as properties of
@@ -201,7 +212,7 @@
                 // "$" internal names as properties of package object.
 
                 final String clsName = binaryName.substring(start);
-                if (clsName.indexOf('$') == -1) {
+                if (clsName.indexOf('$') == -1 && isClassAccessible(binaryName)) {
                     props.add(clsName);
                 }
             }
@@ -214,4 +225,22 @@
                     .map(File::new)
                     .collect(Collectors.toList());
     }
+
+    private boolean isClassAccessible(final String className) {
+        try {
+            final Class<?> clz = context.findClass(className);
+            return Modifier.isPublic(clz.getModifiers());
+        } catch (final ClassNotFoundException cnfe) {
+        }
+        return false;
+    }
+
+    private boolean isPackageAccessible(final String pkgName) {
+        try {
+            Context.checkPackageAccess(pkgName);
+            return true;
+        } catch (final SecurityException se) {
+            return false;
+        }
+    }
 }
--- a/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/PropertiesHelper.java	Wed Jul 05 21:49:00 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/PropertiesHelper.java	Tue Jun 07 19:13:26 2016 +0530
@@ -33,6 +33,7 @@
 import java.util.WeakHashMap;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
+import jdk.nashorn.internal.runtime.Context;
 import jdk.nashorn.internal.runtime.JSType;
 import jdk.nashorn.internal.runtime.NativeJavaPackage;
 import jdk.nashorn.internal.runtime.PropertyMap;
@@ -52,11 +53,11 @@
     /**
      * Construct a new PropertiesHelper.
      *
-     * @param classPath Class path to compute properties of java package objects
+     * @param context the current nashorn Context
      */
-    PropertiesHelper(final String classPath) {
+    PropertiesHelper(final Context context) {
         try {
-            this.pkgsHelper = new PackagesHelper(classPath);
+            this.pkgsHelper = new PackagesHelper(context);
         } catch (final IOException exp) {
             if (Main.DEBUG) {
                 exp.printStackTrace();