1.1 --- a/src/share/classes/com/sun/tools/jdeps/JdepsTask.java Thu Jul 17 15:23:08 2014 -0700 1.2 +++ b/src/share/classes/com/sun/tools/jdeps/JdepsTask.java Fri Jul 18 10:43:41 2014 -0700 1.3 @@ -236,6 +236,11 @@ 1.4 task.options.showLabel = true; 1.5 } 1.6 }, 1.7 + new HiddenOption(false, "-q", "-quiet") { 1.8 + void process(JdepsTask task, String opt, String arg) { 1.9 + task.options.nowarning = true; 1.10 + } 1.11 + }, 1.12 new HiddenOption(true, "-depth") { 1.13 void process(JdepsTask task, String opt, String arg) throws BadArgs { 1.14 try { 1.15 @@ -249,7 +254,7 @@ 1.16 1.17 private static final String PROGNAME = "jdeps"; 1.18 private final Options options = new Options(); 1.19 - private final List<String> classes = new ArrayList<String>(); 1.20 + private final List<String> classes = new ArrayList<>(); 1.21 1.22 private PrintWriter log; 1.23 void setLog(PrintWriter out) { 1.24 @@ -320,7 +325,9 @@ 1.25 1.26 Analyzer analyzer = new Analyzer(options.verbose, new Analyzer.Filter() { 1.27 @Override 1.28 - public boolean accepts(Location origin, Archive originArchive, Location target, Archive targetArchive) { 1.29 + public boolean accepts(Location origin, Archive originArchive, 1.30 + Location target, Archive targetArchive) 1.31 + { 1.32 if (options.findJDKInternals) { 1.33 // accepts target that is JDK class but not exported 1.34 return isJDKArchive(targetArchive) && 1.35 @@ -344,6 +351,10 @@ 1.36 } else { 1.37 printRawOutput(log, analyzer); 1.38 } 1.39 + 1.40 + if (options.findJDKInternals && !options.nowarning) { 1.41 + showReplacements(analyzer); 1.42 + } 1.43 return true; 1.44 } 1.45 1.46 @@ -693,6 +704,7 @@ 1.47 boolean apiOnly; 1.48 boolean showLabel; 1.49 boolean findJDKInternals; 1.50 + boolean nowarning; 1.51 // default is to show package-level dependencies 1.52 // and filter references from same package 1.53 Analyzer.Type verbose = PACKAGE; 1.54 @@ -709,6 +721,7 @@ 1.55 private static class ResourceBundleHelper { 1.56 static final ResourceBundle versionRB; 1.57 static final ResourceBundle bundle; 1.58 + static final ResourceBundle jdkinternals; 1.59 1.60 static { 1.61 Locale locale = Locale.getDefault(); 1.62 @@ -722,6 +735,11 @@ 1.63 } catch (MissingResourceException e) { 1.64 throw new InternalError("version.resource.missing"); 1.65 } 1.66 + try { 1.67 + jdkinternals = ResourceBundle.getBundle("com.sun.tools.jdeps.resources.jdkinternals"); 1.68 + } catch (MissingResourceException e) { 1.69 + throw new InternalError("Cannot find jdkinternals resource bundle"); 1.70 + } 1.71 } 1.72 } 1.73 1.74 @@ -935,4 +953,50 @@ 1.75 } 1.76 return Profile.getProfile(pn); 1.77 } 1.78 + 1.79 + /** 1.80 + * Returns the recommended replacement API for the given classname; 1.81 + * or return null if replacement API is not known. 1.82 + */ 1.83 + private String replacementFor(String cn) { 1.84 + String name = cn; 1.85 + String value = null; 1.86 + while (value == null && name != null) { 1.87 + try { 1.88 + value = ResourceBundleHelper.jdkinternals.getString(name); 1.89 + } catch (MissingResourceException e) { 1.90 + // go up one subpackage level 1.91 + int i = name.lastIndexOf('.'); 1.92 + name = i > 0 ? name.substring(0, i) : null; 1.93 + } 1.94 + } 1.95 + return value; 1.96 + }; 1.97 + 1.98 + private void showReplacements(Analyzer analyzer) { 1.99 + Map<String,String> jdkinternals = new TreeMap<>(); 1.100 + boolean useInternals = false; 1.101 + for (Archive source : sourceLocations) { 1.102 + useInternals = useInternals || analyzer.hasDependences(source); 1.103 + for (String cn : analyzer.dependences(source)) { 1.104 + String repl = replacementFor(cn); 1.105 + if (repl != null && !jdkinternals.containsKey(cn)) { 1.106 + jdkinternals.put(cn, repl); 1.107 + } 1.108 + } 1.109 + } 1.110 + if (useInternals) { 1.111 + log.println(); 1.112 + warning("warn.replace.useJDKInternals", getMessage("jdeps.wiki.url")); 1.113 + } 1.114 + if (!jdkinternals.isEmpty()) { 1.115 + log.println(); 1.116 + log.format("%-40s %s%n", "JDK Internal API", "Suggested Replacement"); 1.117 + log.format("%-40s %s%n", "----------------", "---------------------"); 1.118 + for (Map.Entry<String,String> e : jdkinternals.entrySet()) { 1.119 + log.format("%-40s %s%n", e.getKey(), e.getValue()); 1.120 + } 1.121 + } 1.122 + 1.123 + } 1.124 }