1 /*
2 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.lang.module;
27
28 import java.util.Objects;
29 import java.util.Set;
30
31 /**
32 * A module in a graph of <em>resolved modules</em>.
33 *
34 * <p> {@code ResolvedModule} defines the {@link #configuration configuration}
35 * method to get the configuration that the resolved module is in. It defines
36 * the {@link #reference() reference} method to get the reference to the
37 * module's content.
38 *
39 * @since 9
40 * @spec JPMS
41 * @see Configuration#modules()
42 */
43 public final class ResolvedModule {
44
45 private final Configuration cf;
46 private final ModuleReference mref;
47
48 ResolvedModule(Configuration cf, ModuleReference mref) {
49 this.cf = Objects.requireNonNull(cf);
50 this.mref = Objects.requireNonNull(mref);
51 }
52
53 /**
54 * Returns the configuration that this resolved module is in.
55 *
56 * @return The configuration that this resolved module is in
57 */
58 public Configuration configuration() {
59 return cf;
60 }
61
62 /**
63 * Returns the reference to the module's content.
64 *
65 * @return The reference to the module's content
66 */
67 public ModuleReference reference() {
68 return mref;
69 }
70
71 /**
72 * Returns the module descriptor.
73 *
74 * This convenience method is the equivalent to invoking:
75 * <pre> {@code
76 * reference().descriptor()
77 * }</pre>
78 *
79 * @return The module descriptor
80 */
81 ModuleDescriptor descriptor() {
82 return reference().descriptor();
83 }
84
85 /**
86 * Returns the module name.
87 *
88 * This convenience method is the equivalent to invoking:
89 * <pre> {@code
90 * reference().descriptor().name()
91 * }</pre>
92 *
93 * @return The module name
94 */
95 public String name() {
96 return reference().descriptor().name();
97 }
98
99 /**
100 * Returns the set of resolved modules that this resolved module reads.
101 *
102 * @return A possibly-empty unmodifiable set of resolved modules that
103 * this resolved module reads
104 */
105 public Set<ResolvedModule> reads() {
106 return cf.reads(this);
107 }
108
109 /**
110 * Computes a hash code for this resolved module.
111 *
112 * <p> The hash code is based upon the components of the resolved module
113 * and satisfies the general contract of the {@link Object#hashCode
114 * Object.hashCode} method. </p>
115 *
116 * @return The hash-code value for this resolved module
117 */
118 @Override
119 public int hashCode() {
120 return cf.hashCode() ^ mref.hashCode();
121 }
122
123 /**
124 * Tests this resolved module for equality with the given object.
125 *
126 * <p> If the given object is not a {@code ResolvedModule} then this
127 * method returns {@code false}. Two {@code ResolvedModule} objects are
128 * equal if they are in the same configuration and have equal references
129 * to the module content. </p>
130 *
131 * <p> This method satisfies the general contract of the {@link
132 * java.lang.Object#equals(Object) Object.equals} method. </p>
133 *
134 * @param ob
135 * the object to which this object is to be compared
136 *
137 * @return {@code true} if, and only if, the given object is a module
138 * reference that is equal to this module reference
139 */
140 @Override
141 public boolean equals(Object ob) {
142 if (!(ob instanceof ResolvedModule))
143 return false;
144
145 ResolvedModule that = (ResolvedModule) ob;
146 return Objects.equals(this.cf, that.cf)
147 && Objects.equals(this.mref, that.mref);
148 }
149
150 /**
151 * Returns a string describing this resolved module.
152 *
153 * @return A string describing this resolved module
154 */
155 @Override
156 public String toString() {
157 return System.identityHashCode(cf) + "/" + name();
158 }
159
160 }
161