langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/DepsAnalyzer.java
author mchung
Mon, 19 Dec 2016 12:30:39 -0800
changeset 42840 dfe1a03d4db4
parent 42407 f3702cff2933
permissions -rw-r--r--
8171418: Remove jdeps internal --include-system-modules option Reviewed-by: dfuchs, lancea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
     1
/*
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
     2
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
     4
 *
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    10
 *
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    15
 * accompanied this code).
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    16
 *
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    20
 *
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    23
 * questions.
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    24
 */
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    25
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    26
package com.sun.tools.jdeps;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    27
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    28
import com.sun.tools.classfile.Dependency.Location;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    29
import java.io.IOException;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    30
import java.util.ArrayList;
42840
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
    31
import java.util.Collection;
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    32
import java.util.Deque;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    33
import java.util.LinkedHashSet;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    34
import java.util.LinkedList;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    35
import java.util.List;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    36
import java.util.Optional;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    37
import java.util.Set;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    38
import java.util.concurrent.ConcurrentLinkedDeque;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    39
import java.util.stream.Collectors;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    40
import java.util.stream.Stream;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    41
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    42
import static com.sun.tools.jdeps.Analyzer.Type.CLASS;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    43
import static com.sun.tools.jdeps.Analyzer.Type.VERBOSE;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    44
import static com.sun.tools.jdeps.Module.trace;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    45
import static java.util.stream.Collectors.*;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    46
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    47
/**
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    48
 * Dependency Analyzer.
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    49
 *
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    50
 * Type of filters:
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    51
 * source filter: -include <pattern>
41860
906670ff49c7 8167057: jdeps option to list modules and internal APIs for @modules for test dev
mchung
parents: 40762
diff changeset
    52
 * target filter: -package, -regex, --require
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    53
 *
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    54
 * The initial archive set for analysis includes
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    55
 * 1. archives specified in the command line arguments
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    56
 * 2. observable modules matching the source filter
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    57
 * 3. classpath archives matching the source filter or target filter
40762
f8883aa0053c 8160851: Remove old launcher module-related options
mchung
parents: 39101
diff changeset
    58
 * 4. --add-modules and -m root modules
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    59
 */
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    60
public class DepsAnalyzer {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    61
    final JdepsConfiguration configuration;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    62
    final JdepsFilter filter;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    63
    final JdepsWriter writer;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    64
    final Analyzer.Type verbose;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    65
    final boolean apiOnly;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    66
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    67
    final DependencyFinder finder;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    68
    final Analyzer analyzer;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    69
    final List<Archive> rootArchives = new ArrayList<>();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    70
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    71
    // parsed archives
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    72
    final Set<Archive> archives = new LinkedHashSet<>();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    73
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    74
    public DepsAnalyzer(JdepsConfiguration config,
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    75
                        JdepsFilter filter,
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    76
                        JdepsWriter writer,
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    77
                        Analyzer.Type verbose,
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    78
                        boolean apiOnly) {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    79
        this.configuration = config;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    80
        this.filter = filter;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    81
        this.writer = writer;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    82
        this.verbose = verbose;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    83
        this.apiOnly = apiOnly;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    84
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    85
        this.finder = new DependencyFinder(config, filter);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    86
        this.analyzer = new Analyzer(configuration, verbose, filter);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    87
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    88
        // determine initial archives to be analyzed
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    89
        this.rootArchives.addAll(configuration.initialArchives());
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    90
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    91
        // if -include pattern is specified, add the matching archives on
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    92
        // classpath to the root archives
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    93
        if (filter.hasIncludePattern() || filter.hasTargetFilter()) {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    94
            configuration.getModules().values().stream()
42840
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
    95
                .filter(source -> include(source) && filter.matches(source))
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    96
                .forEach(this.rootArchives::add);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    97
        }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    98
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
    99
        // class path archives
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   100
        configuration.classPathArchives().stream()
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   101
            .filter(filter::matches)
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   102
            .forEach(this.rootArchives::add);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   103
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   104
        // Include the root modules for analysis
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   105
        this.rootArchives.addAll(configuration.rootModules());
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   106
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   107
        trace("analyze root archives: %s%n", this.rootArchives);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   108
    }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   109
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   110
    /*
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   111
     * Perform runtime dependency analysis
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   112
     */
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   113
    public boolean run() throws IOException {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   114
        return run(false, 1);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   115
    }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   116
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   117
    /**
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   118
     * Perform compile-time view or run-time view dependency analysis.
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   119
     *
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   120
     * @param compileTimeView
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   121
     * @param maxDepth  depth of recursive analysis.  depth == 0 if -R is set
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   122
     */
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   123
    public boolean run(boolean compileTimeView, int maxDepth) throws IOException {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   124
        try {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   125
            // parse each packaged module or classpath archive
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   126
            if (apiOnly) {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   127
                finder.parseExportedAPIs(rootArchives.stream());
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   128
            } else {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   129
                finder.parse(rootArchives.stream());
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   130
            }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   131
            archives.addAll(rootArchives);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   132
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   133
            int depth = maxDepth > 0 ? maxDepth : Integer.MAX_VALUE;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   134
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   135
            // transitive analysis
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   136
            if (depth > 1) {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   137
                if (compileTimeView)
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   138
                    transitiveArchiveDeps(depth-1);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   139
                else
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   140
                    transitiveDeps(depth-1);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   141
            }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   142
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   143
            Set<Archive> archives = archives();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   144
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   145
            // analyze the dependencies collected
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   146
            analyzer.run(archives, finder.locationToArchive());
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   147
41860
906670ff49c7 8167057: jdeps option to list modules and internal APIs for @modules for test dev
mchung
parents: 40762
diff changeset
   148
            if (writer != null) {
906670ff49c7 8167057: jdeps option to list modules and internal APIs for @modules for test dev
mchung
parents: 40762
diff changeset
   149
                writer.generateOutput(archives, analyzer);
906670ff49c7 8167057: jdeps option to list modules and internal APIs for @modules for test dev
mchung
parents: 40762
diff changeset
   150
            }
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   151
        } finally {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   152
            finder.shutdown();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   153
        }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   154
        return true;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   155
    }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   156
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   157
    /**
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   158
     * Returns the archives for reporting that has matching dependences.
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   159
     *
41860
906670ff49c7 8167057: jdeps option to list modules and internal APIs for @modules for test dev
mchung
parents: 40762
diff changeset
   160
     * If --require is set, they should be excluded.
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   161
     */
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   162
    Set<Archive> archives() {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   163
        if (filter.requiresFilter().isEmpty()) {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   164
            return archives.stream()
42840
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   165
                .filter(this::include)
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   166
                .filter(Archive::hasDependences)
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   167
                .collect(Collectors.toSet());
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   168
        } else {
41860
906670ff49c7 8167057: jdeps option to list modules and internal APIs for @modules for test dev
mchung
parents: 40762
diff changeset
   169
            // use the archives that have dependences and not specified in --require
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   170
            return archives.stream()
42840
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   171
                .filter(this::include)
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   172
                .filter(source -> !filter.requiresFilter().contains(source.getName()))
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   173
                .filter(source ->
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   174
                        source.getDependencies()
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   175
                              .map(finder::locationToArchive)
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   176
                              .anyMatch(a -> a != source))
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   177
                .collect(Collectors.toSet());
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   178
        }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   179
    }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   180
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   181
    /**
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   182
     * Returns the dependences, either class name or package name
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   183
     * as specified in the given verbose level.
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   184
     */
39101
fd8a6392b7ea 8159524: jdeps -jdkinternals throws NPE when no replacement is known
mchung
parents: 38532
diff changeset
   185
    Set<String> dependences() {
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   186
        return analyzer.archives().stream()
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   187
                       .map(analyzer::dependences)
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   188
                       .flatMap(Set::stream)
39101
fd8a6392b7ea 8159524: jdeps -jdkinternals throws NPE when no replacement is known
mchung
parents: 38532
diff changeset
   189
                       .collect(Collectors.toSet());
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   190
    }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   191
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   192
    /**
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   193
     * Returns the archives that contains the given locations and
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   194
     * not parsed and analyzed.
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   195
     */
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   196
    private Set<Archive> unresolvedArchives(Stream<Location> locations) {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   197
        return locations.filter(l -> !finder.isParsed(l))
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   198
                        .distinct()
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   199
                        .map(configuration::findClass)
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   200
                        .flatMap(Optional::stream)
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   201
                        .collect(toSet());
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   202
    }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   203
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   204
    /*
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   205
     * Recursively analyzes entire module/archives.
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   206
    */
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   207
    private void transitiveArchiveDeps(int depth) throws IOException {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   208
        Stream<Location> deps = archives.stream()
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   209
                                        .flatMap(Archive::getDependencies);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   210
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   211
        // start with the unresolved archives
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   212
        Set<Archive> unresolved = unresolvedArchives(deps);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   213
        do {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   214
            // parse all unresolved archives
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   215
            Set<Location> targets = apiOnly
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   216
                ? finder.parseExportedAPIs(unresolved.stream())
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   217
                : finder.parse(unresolved.stream());
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   218
            archives.addAll(unresolved);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   219
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   220
            // Add dependencies to the next batch for analysis
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   221
            unresolved = unresolvedArchives(targets.stream());
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   222
        } while (!unresolved.isEmpty() && depth-- > 0);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   223
    }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   224
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   225
    /*
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   226
     * Recursively analyze the class dependences
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   227
     */
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   228
    private void transitiveDeps(int depth) throws IOException {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   229
        Stream<Location> deps = archives.stream()
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   230
                                        .flatMap(Archive::getDependencies);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   231
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   232
        Deque<Location> unresolved = deps.collect(Collectors.toCollection(LinkedList::new));
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   233
        ConcurrentLinkedDeque<Location> deque = new ConcurrentLinkedDeque<>();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   234
        do {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   235
            Location target;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   236
            while ((target = unresolved.poll()) != null) {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   237
                if (finder.isParsed(target))
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   238
                    continue;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   239
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   240
                Archive archive = configuration.findClass(target).orElse(null);
42840
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   241
                if (archive != null) {
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   242
                    archives.add(archive);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   243
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   244
                    String name = target.getName();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   245
                    Set<Location> targets = apiOnly
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   246
                            ? finder.parseExportedAPIs(archive, name)
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   247
                            : finder.parse(archive, name);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   248
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   249
                    // build unresolved dependencies
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   250
                    targets.stream()
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   251
                           .filter(t -> !finder.isParsed(t))
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   252
                           .forEach(deque::add);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   253
                }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   254
            }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   255
            unresolved = deque;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   256
            deque = new ConcurrentLinkedDeque<>();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   257
        } while (!unresolved.isEmpty() && depth-- > 0);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   258
    }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   259
42840
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   260
    /*
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   261
     * Tests if the given archive is requested for analysis.
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   262
     * It includes the root modules specified in --module, --add-modules
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   263
     * or modules specified on the command line
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   264
     *
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   265
     * This filters system module by default unless they are explicitly
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   266
     * requested.
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   267
     */
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   268
    public boolean include(Archive source) {
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   269
        Module module = source.getModule();
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   270
        // skip system module by default
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   271
        return  !module.isSystem()
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   272
                    || configuration.rootModules().contains(source);
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   273
    }
dfe1a03d4db4 8171418: Remove jdeps internal --include-system-modules option
mchung
parents: 42407
diff changeset
   274
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   275
    // ----- for testing purpose -----
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   276
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   277
    public static enum Info {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   278
        REQUIRES,
42407
f3702cff2933 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41860
diff changeset
   279
        REQUIRES_TRANSITIVE,
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   280
        EXPORTED_API,
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   281
        MODULE_PRIVATE,
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   282
        QUALIFIED_EXPORTED_API,
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   283
        INTERNAL_API,
38532
24f77d64bb1f 8153042: jdeps should continue to report JDK internal APIs that are removed/renamed in JDK
mchung
parents: 38524
diff changeset
   284
        JDK_INTERNAL_API,
24f77d64bb1f 8153042: jdeps should continue to report JDK internal APIs that are removed/renamed in JDK
mchung
parents: 38524
diff changeset
   285
        JDK_REMOVED_INTERNAL_API
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   286
    }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   287
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   288
    public static class Node {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   289
        public final String name;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   290
        public final String source;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   291
        public final Info info;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   292
        Node(String name, Info info) {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   293
            this(name, name, info);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   294
        }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   295
        Node(String name, String source, Info info) {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   296
            this.name = name;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   297
            this.source = source;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   298
            this.info = info;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   299
        }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   300
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   301
        @Override
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   302
        public String toString() {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   303
            StringBuilder sb = new StringBuilder();
42407
f3702cff2933 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41860
diff changeset
   304
            if (info != Info.REQUIRES && info != Info.REQUIRES_TRANSITIVE)
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   305
                sb.append(source).append("/");
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   306
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   307
            sb.append(name);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   308
            if (info == Info.QUALIFIED_EXPORTED_API)
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   309
                sb.append(" (qualified)");
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   310
            else if (info == Info.JDK_INTERNAL_API)
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   311
                sb.append(" (JDK internal)");
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   312
            else if (info == Info.INTERNAL_API)
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   313
                sb.append(" (internal)");
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   314
            return sb.toString();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   315
        }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   316
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   317
        @Override
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   318
        public boolean equals(Object o) {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   319
            if (!(o instanceof Node))
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   320
                return false;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   321
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   322
            Node other = (Node)o;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   323
            return this.name.equals(other.name) &&
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   324
                    this.source.equals(other.source) &&
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   325
                    this.info.equals(other.info);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   326
        }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   327
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   328
        @Override
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   329
        public int hashCode() {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   330
            int result = name.hashCode();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   331
            result = 31 * result + source.hashCode();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   332
            result = 31 * result + info.hashCode();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   333
            return result;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   334
        }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   335
    }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   336
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   337
    /**
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   338
     * Returns a graph of module dependences.
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   339
     *
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   340
     * Each Node represents a module and each edge is a dependence.
42407
f3702cff2933 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41860
diff changeset
   341
     * No analysis on "requires transitive".
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   342
     */
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   343
    public Graph<Node> moduleGraph() {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   344
        Graph.Builder<Node> builder = new Graph.Builder<>();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   345
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   346
        archives().stream()
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   347
            .forEach(m -> {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   348
                Node u = new Node(m.getName(), Info.REQUIRES);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   349
                builder.addNode(u);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   350
                analyzer.requires(m)
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   351
                    .map(req -> new Node(req.getName(), Info.REQUIRES))
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   352
                    .forEach(v -> builder.addEdge(u, v));
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   353
            });
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   354
        return builder.build();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   355
    }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   356
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   357
    /**
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   358
     * Returns a graph of dependences.
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   359
     *
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   360
     * Each Node represents a class or package per the specified verbose level.
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   361
     * Each edge indicates
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   362
     */
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   363
    public Graph<Node> dependenceGraph() {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   364
        Graph.Builder<Node> builder = new Graph.Builder<>();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   365
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   366
        archives().stream()
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   367
            .map(analyzer.results::get)
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   368
            .filter(deps -> !deps.dependencies().isEmpty())
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   369
            .flatMap(deps -> deps.dependencies().stream())
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   370
            .forEach(d -> addEdge(builder, d));
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   371
        return builder.build();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   372
    }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   373
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   374
    private void addEdge(Graph.Builder<Node> builder, Analyzer.Dep dep) {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   375
        Archive source = dep.originArchive();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   376
        Archive target = dep.targetArchive();
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   377
        String pn = dep.target();
41860
906670ff49c7 8167057: jdeps option to list modules and internal APIs for @modules for test dev
mchung
parents: 40762
diff changeset
   378
        if (verbose == CLASS || verbose == VERBOSE) {
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   379
            int i = dep.target().lastIndexOf('.');
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   380
            pn = i > 0 ? dep.target().substring(0, i) : "";
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   381
        }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   382
        final Info info;
41860
906670ff49c7 8167057: jdeps option to list modules and internal APIs for @modules for test dev
mchung
parents: 40762
diff changeset
   383
        Module targetModule = target.getModule();
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   384
        if (source == target) {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   385
            info = Info.MODULE_PRIVATE;
41860
906670ff49c7 8167057: jdeps option to list modules and internal APIs for @modules for test dev
mchung
parents: 40762
diff changeset
   386
        } else if (!targetModule.isNamed()) {
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   387
            info = Info.EXPORTED_API;
41860
906670ff49c7 8167057: jdeps option to list modules and internal APIs for @modules for test dev
mchung
parents: 40762
diff changeset
   388
        } else if (targetModule.isExported(pn) && !targetModule.isJDKUnsupported()) {
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   389
            info = Info.EXPORTED_API;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   390
        } else {
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   391
            Module module = target.getModule();
38532
24f77d64bb1f 8153042: jdeps should continue to report JDK internal APIs that are removed/renamed in JDK
mchung
parents: 38524
diff changeset
   392
            if (module == Analyzer.REMOVED_JDK_INTERNALS) {
24f77d64bb1f 8153042: jdeps should continue to report JDK internal APIs that are removed/renamed in JDK
mchung
parents: 38524
diff changeset
   393
                info = Info.JDK_REMOVED_INTERNAL_API;
24f77d64bb1f 8153042: jdeps should continue to report JDK internal APIs that are removed/renamed in JDK
mchung
parents: 38524
diff changeset
   394
            } else if (!source.getModule().isJDK() && module.isJDK())
38524
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   395
                info = Info.JDK_INTERNAL_API;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   396
                // qualified exports or inaccessible
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   397
            else if (module.isExported(pn, source.getModule().name()))
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   398
                info = Info.QUALIFIED_EXPORTED_API;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   399
            else
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   400
                info = Info.INTERNAL_API;
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   401
        }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   402
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   403
        Node u = new Node(dep.origin(), source.getName(), info);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   404
        Node v = new Node(dep.target(), target.getName(), info);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   405
        builder.addEdge(u, v);
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   406
    }
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   407
badd925c1d2f 8156680: jdeps implementation refresh
mchung
parents:
diff changeset
   408
}