Path: blob/master/test/langtools/tools/jdeps/lib/ModuleMetaData.java
41149 views
/*1* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/222324import com.sun.tools.jdeps.DepsAnalyzer;2526import java.util.Collections;27import java.util.LinkedHashMap;28import java.util.Map;29import java.util.Set;3031import static com.sun.tools.jdeps.DepsAnalyzer.Info.*;32import static java.lang.module.ModuleDescriptor.Requires.Modifier.*;33import static java.lang.module.ModuleDescriptor.*;3435import static org.testng.Assert.assertEquals;36import static org.testng.Assert.assertTrue;373839public class ModuleMetaData {40public static final String JAVA_BASE = "java.base";4142static final String INTERNAL = "(internal)";43static final String QUALIFIED = "(qualified)";44static final String JDK_INTERNAL = "JDK internal API";45static final String REMOVED_JDK_INTERNAL = "JDK removed internal API";4647final String moduleName;48final boolean isNamed;49final Map<String, ModuleRequires> requires = new LinkedHashMap<>();50final Map<String, Dependence> references = new LinkedHashMap<>();51final Map<String, Set<String>> exports = new LinkedHashMap<>();5253ModuleMetaData(String name) {54this(name, true);55}5657ModuleMetaData(String name, boolean isNamed) {58this.moduleName = name;59this.isNamed = isNamed;60requires(JAVA_BASE); // implicit requires61}6263String name() {64return moduleName;65}6667ModuleMetaData requires(String name) {68requires.put(name, new ModuleRequires(name));69return this;70}7172ModuleMetaData requiresTransitive(String name) {73requires.put(name, new ModuleRequires(name, TRANSITIVE));74return this;75}7677// for unnamed module78ModuleMetaData depends(String name) {79requires.put(name, new ModuleRequires(name));80return this;81}8283ModuleMetaData reference(String origin, String target, String module) {84return dependence(origin, target, module, "");85}8687ModuleMetaData internal(String origin, String target, String module) {88return dependence(origin, target, module, INTERNAL);89}9091ModuleMetaData qualified(String origin, String target, String module) {92return dependence(origin, target, module, QUALIFIED);93}9495ModuleMetaData jdkInternal(String origin, String target, String module) {96return dependence(origin, target, module, JDK_INTERNAL);97}98ModuleMetaData removedJdkInternal(String origin, String target) {99return dependence(origin, target, REMOVED_JDK_INTERNAL, REMOVED_JDK_INTERNAL);100}101102ModuleMetaData exports(String pn, Set<String> targets) {103exports.put(pn, targets);104return this;105}106107private ModuleMetaData dependence(String origin, String target, String module, String access) {108references.put(key(origin, target), new Dependence(origin, target, module, access));109return this;110}111112String key(String origin, String target) {113return origin + ":" + target;114}115116void checkRequires(String name, Set<DepsAnalyzer.Node> adjacentNodes) {117// System.err.format("%s: Expected %s Found %s %n", name, requires, adjacentNodes);118adjacentNodes.stream()119.forEach(v -> checkRequires(v.name));120assertEquals(adjacentNodes.size(), requires.size());121}122123void checkRequires(String name) {124ModuleRequires req = requires.get(name);125if (req == null)126System.err.println(moduleName + ": unexpected requires " + name);127assertTrue(requires.containsKey(name));128}129130void checkRequires(Requires require) {131String name = require.name();132if (name.equals(JAVA_BASE))133return;134135ModuleRequires req = requires.get(name);136if (req == null)137System.err.format("%s: unexpected dependence %s%n", moduleName, name);138139assertTrue(requires.containsKey(name));140141assertEquals(require.modifiers(), req.modifiers());142}143144void checkDependences(String name, Set<DepsAnalyzer.Node> adjacentNodes) {145// System.err.format("%s: Expected %s Found %s %n", name, references, adjacentNodes);146147adjacentNodes.stream()148.forEach(v -> checkDependence(name, v.name, v.source, v.info));149assertEquals(adjacentNodes.size(), references.size());150}151152void checkDependence(String origin, String target, String module, DepsAnalyzer.Info info) {153String key = key(origin, target);154Dependence dep = references.get(key);155String access = "";156if (info == QUALIFIED_EXPORTED_API)157access = QUALIFIED;158else if (info == JDK_INTERNAL_API)159access = JDK_INTERNAL;160else if (info == JDK_REMOVED_INTERNAL_API)161access = REMOVED_JDK_INTERNAL;162else if (info == INTERNAL_API)163access = INTERNAL;164165assertTrue(references.containsKey(key));166167assertEquals(dep.access, access);168assertEquals(dep.module, module);169}170171172public static class ModuleRequires {173final String name;174final Requires.Modifier mod;175176ModuleRequires(String name) {177this.name = name;178this.mod = null;179}180181ModuleRequires(String name, Requires.Modifier mod) {182this.name = name;183this.mod = mod;184}185186Set<Requires.Modifier> modifiers() {187return mod != null ? Set.of(mod) : Collections.emptySet();188}189190@Override191public String toString() {192return name;193}194}195196public static class Dependence {197final String origin;198final String target;199final String module;200final String access;201202Dependence(String origin, String target, String module, String access) {203this.origin = origin;204this.target = target;205this.module = module;206this.access = access;207}208209@Override210public String toString() {211return String.format("%s -> %s (%s) %s", origin, target, module, access);212}213}214}215216217