src/share/classes/com/sun/tools/jdeps/JdepsTask.java

changeset 2539
a51b7fd0543b
parent 2538
1e39ae45d8ac
child 2702
9ca8d8713094
child 2802
6b43535fb9f8
     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  }

mercurial