Skip to content

Commit 0c0ad6a

Browse files
Restoring lost changes and updating some comments.
1 parent 2d56562 commit 0c0ad6a

File tree

4 files changed

+54
-93
lines changed

4 files changed

+54
-93
lines changed

src/java.base/share/classes/jdk/internal/jimage/ModuleReference.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,7 @@
5252
* to the jimage file provided by the shipped JDK by tools running on JDK 8.
5353
*/
5454
public final class ModuleReference implements Comparable<ModuleReference> {
55-
// The following flags are designed to be additive (hence "has-resources"
56-
// rather than "is-empty", even though "isEmpty()" is whats in the API).
57-
// API methods like "isEmpty()" and "hasPreviewVersion()" are designed to
58-
// match the semantics of ImageLocation flags to avoid having business
59-
// logic need to reason about two different flag regimes.
55+
// The following flags are designed to be additive.
6056

6157
/** If set, the associated module has resources (in normal or preview mode). */
6258
private static final int FLAGS_HAS_CONTENT = 0x1;

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageResourcesTree.java

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -128,35 +128,14 @@ public ResourceNode(String name, Node parent) {
128128
* {@code java.base} and {@code java.logging} modules. This means both
129129
* {@code "/packages/java.util/java.base"} and
130130
* {@code "/packages/java.util/java.logging"} will exist, but only
131-
* {@code "java.base"} entry will be marked as non-empty.
131+
* {@code "java.base"} entry will be marked as having content.
132132
*
133-
* <p>For preview mode however, a package that's empty in non-preview mode
134-
* can be non-empty in preview mode. Furthermore, packages which only exist
135-
* in preview mode (empty or not) need to be ignored in non-preview mode.
133+
* <p>When processing module references in non-preview mode, entries marked
134+
* as {@link ModuleReference#isPreviewOnly() preview-only} must be ignored.
136135
*
137-
* <p>To account for this, the following flags are used for each module
138-
* reference in a package node:
139-
* <ul>
140-
* <li>{@code HAS_NORMAL_CONTENT}: Packages with resources in normal
141-
* mode. At most one entry will have this flag set.
142-
* <li>{@code HAS_PREVIEW_CONTENT}: Packages with resources in preview
143-
* mode. At most one entry will have this flag set.
144-
* <li>{@code IS_PREVIEW_ONLY}: This is set for packages, empty
145-
* or not, which exist only in preview mode.
146-
* </ul>
147-
*
148-
* <p>While there are 8 combinations of these 3 flags, some will never
149-
* occur (e.g. {@code HAS_NORMAL_CONTENT + IS_PREVIEW_ONLY}).
150-
*
151-
* <p>Package node entries are sorted by name, with the exception that (if
152-
* it exists) the unique entry marked as having content will be listed first.
153-
*
154-
* <p>When processing entries in normal (non preview) mode, entries marked
155-
* with {@code IS_PREVIEW_ONLY} must be ignored. If, after filtering, there
156-
* are no entries left, then the entire package must be ignored.
157-
*
158-
* <p>After this, in either mode, the content flag(s) of the first entry
159-
* determine if that module contains resources for the package.
136+
* <p>If all entries in a package are preview-only, then the package's flags
137+
* have {@link ImageLocation#FLAGS_IS_PREVIEW_ONLY FLAGS_IS_PREVIEW_ONLY}
138+
* set, and the entire package must be ignored.
160139
*/
161140
// Visible for testing only.
162141
static final class PackageNode extends Node {

test/jdk/tools/jlink/whitebox/ImageResourcesTreeTestDriver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@
2626
* @summary Whitebox tests for ImageResourcesTree.
2727
* @modules jdk.jlink/jdk.tools.jlink.internal
2828
* @build jdk.jlink/jdk.tools.jlink.internal.ImageResourcesTreeTest
29-
* @run junit/othervm jdk.jlink/jdk.tools.jlink.internal.ImageResourcesTreeTest
29+
* @run junit/othervm -ea -esa jdk.jlink/jdk.tools.jlink.internal.ImageResourcesTreeTest
3030
*/
3131
public class ImageResourcesTreeTestDriver {}

test/jdk/tools/jlink/whitebox/jdk.jlink/jdk/tools/jlink/internal/ImageResourcesTreeTest.java

Lines changed: 46 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323

2424
package jdk.tools.jlink.internal;
2525

26+
import jdk.internal.jimage.ModuleReference;
2627
import jdk.tools.jlink.internal.ImageResourcesTree.Node;
2728
import jdk.tools.jlink.internal.ImageResourcesTree.PackageNode;
28-
import jdk.tools.jlink.internal.ImageResourcesTree.PackageNode.PackageReference;
2929
import jdk.tools.jlink.internal.ImageResourcesTree.ResourceNode;
3030
import jdk.tools.jlink.internal.ImageResourcesTree.Tree;
3131
import org.junit.jupiter.api.Test;
@@ -46,11 +46,6 @@ public class ImageResourcesTreeTest {
4646
private static final String MODULES_PREFIX = "/modules/";
4747
private static final String PACKAGES_PREFIX = "/packages/";
4848

49-
// Package entry flags copied from ImageResourcesTree.
50-
private static final int PKG_FLAG_HAS_NORMAL_CONTENT = 0x1;
51-
private static final int PKG_FLAG_HAS_PREVIEW_CONTENT = 0x2;
52-
private static final int PKG_FLAG_IS_PREVIEW_ONLY = 0x4;
53-
5449
@Test
5550
public void directoryNodes() {
5651
List<String> paths = List.of(
@@ -139,19 +134,15 @@ public void expectedPackageEntries() {
139134
Tree tree = new Tree(paths);
140135
Map<String, Node> nodes = tree.getMap();
141136
PackageNode pkgUtil = getPackageNode(nodes, "java.util");
142-
assertEquals(2, pkgUtil.moduleCount());
143-
List<PackageReference> modRefs = pkgUtil.modules().toList();
137+
List<ModuleReference> modRefs = pkgUtil.getModuleReferences();
138+
assertEquals(2, modRefs.size());
144139

145-
List<String> modNames = modRefs.stream().map(PackageReference::name).toList();
140+
List<String> modNames = modRefs.stream().map(ModuleReference::name).toList();
146141
assertEquals(List.of("java.base", "java.logging"), modNames);
147142

148-
PackageReference baseRef = modRefs.get(0);
149-
assertNonEmptyRef(baseRef, "java.base");
150-
assertEquals(PKG_FLAG_HAS_NORMAL_CONTENT, baseRef.flags());
151-
152-
PackageReference loggingRef = modRefs.get(1);
153-
assertEmptyRef(loggingRef, "java.logging");
154-
assertEquals(0, loggingRef.flags());
143+
// Ordered by name.
144+
assertNonEmptyRef(modRefs.get(0), "java.base");
145+
assertEmptyRef(modRefs.get(1), "java.logging");
155146
}
156147

157148
@Test
@@ -165,11 +156,11 @@ public void expectedPackageEntries_withPreviewResources() {
165156
Tree tree = new Tree(paths);
166157
Map<String, Node> nodes = tree.getMap();
167158
PackageNode pkgUtil = getPackageNode(nodes, "java.util");
168-
List<PackageReference> modRefs = pkgUtil.modules().toList();
159+
List<ModuleReference> modRefs = pkgUtil.getModuleReferences();
169160

170-
PackageReference baseRef = modRefs.get(0);
161+
ModuleReference baseRef = modRefs.get(0);
171162
assertNonEmptyRef(baseRef, "java.base");
172-
assertEquals(PKG_FLAG_HAS_NORMAL_CONTENT | PKG_FLAG_HAS_PREVIEW_CONTENT, baseRef.flags());
163+
assertTrue(baseRef.hasPreviewVersion());
173164
}
174165

175166
@Test
@@ -183,57 +174,52 @@ public void expectedPackageEntries_withPreviewOnlyPackages() {
183174

184175
// Preview only package (with content).
185176
PackageNode nonEmptyPkg = getPackageNode(nodes, "java.util.preview.only");
186-
PackageReference nonEmptyRef = nonEmptyPkg.modules().findFirst().orElseThrow();
177+
ModuleReference nonEmptyRef = nonEmptyPkg.getModuleReferences().getFirst();
187178
assertNonEmptyPreviewOnlyRef(nonEmptyRef, "java.base");
188-
assertEquals(PKG_FLAG_IS_PREVIEW_ONLY | PKG_FLAG_HAS_PREVIEW_CONTENT, nonEmptyRef.flags());
189179

190180
// Preview only packages can be empty.
191181
PackageNode emptyPkg = getPackageNode(nodes, "java.util.preview");
192-
PackageReference emptyRef = emptyPkg.modules().findFirst().orElseThrow();
182+
ModuleReference emptyRef = emptyPkg.getModuleReferences().getFirst();
193183
assertEmptyPreviewOnlyRef(emptyRef, "java.base");
194-
assertEquals(PKG_FLAG_IS_PREVIEW_ONLY, emptyRef.flags());
195184
}
196185

197186
@Test
198-
public void expectedPackageEntries_sharedPackage() {
199-
// Resource in many modules define the same package (java.shared).
200-
// However, the package "java.shared" only has content in one module.
187+
public void expectedPackageOrder_sharedPackage() {
188+
// Resource in many modules define the same package (java.shared), but
189+
// this only has content in one module (java.content).
201190
// Order of test data is shuffled to show reordering in entry list.
202-
// "java.preview" would sort before after "java.resource" if it were
203-
// only sorted by name, but the preview flag has precedence.
204-
// Expect: content -> resource{1..6} -> preview{7..8}
191+
// "java.moduleN" would sort before after "java.previewN" if it were
192+
// only sorted by name, but preview entries come first.
193+
// Expect: preview{1..3) -> content -> module{1..3}
205194
List<String> paths = List.of(
206-
"/java.resource1/java/shared/one/SomeClass.class",
207-
"/java.preview7/META-INF/preview/java/shared/foo/SomeClass.class",
208-
"/java.resource3/java/shared/three/SomeClass.class",
209-
"/java.resource6/java/shared/six/SomeClass.class",
210-
"/java.preview8/META-INF/preview/java/shared/bar/SomeClass.class",
211-
"/java.resource5/java/shared/five/SomeClass.class",
195+
// Module with content in "java.shared".
212196
"/java.content/java/shared/MainPackageClass.class",
213-
"/java.resource2/java/shared/two/SomeClass.class",
214-
"/java.resource4/java/shared/four/SomeClass.class");
197+
// Other resources (in other modules) which implicitly define "java.shared".
198+
"/java.module3/java/shared/three/SomeClass.class",
199+
"/java.module2/java/shared/two/SomeClass.class",
200+
"/java.module1/java/shared/one/SomeClass.class",
201+
// Preview resources in other modules which implicitly define "java.shared".
202+
"/java.preview3/META-INF/preview/java/shared/baz/SomeClass.class",
203+
"/java.preview2/META-INF/preview/java/shared/bar/SomeClass.class",
204+
"/java.preview1/META-INF/preview/java/shared/foo/SomeClass.class");
215205

216206
Tree tree = new Tree(paths);
217207
Map<String, Node> nodes = tree.getMap();
218208

219-
// Preview only package (with content).
220209
PackageNode sharedPkg = getPackageNode(nodes, "java.shared");
221-
assertEquals(9, sharedPkg.moduleCount());
222-
223-
List<PackageReference> refs = sharedPkg.modules().toList();
224-
assertNonEmptyRef(refs.getFirst(), "java.content");
225-
assertEquals(PKG_FLAG_HAS_NORMAL_CONTENT, refs.getFirst().flags());
210+
List<ModuleReference> refs = sharedPkg.getModuleReferences();
226211

227-
// Empty non-preview refs after non-empty ref.
228-
int idx = 1;
229-
for (PackageReference emptyRef : refs.subList(1, 7)) {
230-
assertEmptyRef(emptyRef, "java.resource" + idx++);
231-
assertEquals(0, emptyRef.flags());
212+
// Preview packages first, by name.
213+
int n = 1;
214+
for (ModuleReference ref : refs.subList(0, 3)) {
215+
assertEmptyPreviewOnlyRef(ref, "java.preview" + (n++));
232216
}
233-
// Empty preview-only refs last.
234-
for (PackageReference emptyRef : refs.subList(7, 9)) {
235-
assertEmptyPreviewOnlyRef(emptyRef, "java.preview" + idx++);
236-
assertEquals(PKG_FLAG_IS_PREVIEW_ONLY, emptyRef.flags());
217+
// The content package (simply due to its name).
218+
assertNonEmptyRef(refs.get(3), "java.content");
219+
// And the non-preview empty packages after.
220+
n = 1;
221+
for (ModuleReference ref : refs.subList(4, 7)) {
222+
assertEmptyRef(ref, "java.module" + (n++));
237223
}
238224
}
239225

@@ -249,27 +235,27 @@ static void assertContainsResources(Node dirNode, String... resourceNames) {
249235
}
250236
}
251237

252-
static void assertNonEmptyRef(PackageReference ref, String modName) {
238+
static void assertNonEmptyRef(ModuleReference ref, String modName) {
253239
assertEquals(modName, ref.name(), "Unexpected module name: " + ref);
254-
assertFalse(ref.isEmpty(), "Expected non-empty reference: " + ref);
240+
assertTrue(ref.hasContent(), "Expected non-empty reference: " + ref);
255241
assertFalse(ref.isPreviewOnly(), "Expected not preview-only: " + ref);
256242
}
257243

258-
static void assertEmptyRef(PackageReference ref, String modName) {
244+
static void assertEmptyRef(ModuleReference ref, String modName) {
259245
assertEquals(modName, ref.name(), "Unexpected module name: " + ref);
260-
assertTrue(ref.isEmpty(), "Expected empty reference: " + ref);
246+
assertFalse(ref.hasContent(), "Expected empty reference: " + ref);
261247
assertFalse(ref.isPreviewOnly(), "Expected not preview-only: " + ref);
262248
}
263249

264-
static void assertNonEmptyPreviewOnlyRef(PackageReference ref, String modName) {
250+
static void assertNonEmptyPreviewOnlyRef(ModuleReference ref, String modName) {
265251
assertEquals(modName, ref.name(), "Unexpected module name: " + ref);
266-
assertFalse(ref.isEmpty(), "Expected empty reference: " + ref);
252+
assertTrue(ref.hasContent(), "Expected empty reference: " + ref);
267253
assertTrue(ref.isPreviewOnly(), "Expected preview-only: " + ref);
268254
}
269255

270-
static void assertEmptyPreviewOnlyRef(PackageReference ref, String modName) {
256+
static void assertEmptyPreviewOnlyRef(ModuleReference ref, String modName) {
271257
assertEquals(modName, ref.name(), "Unexpected module name: " + ref);
272-
assertTrue(ref.isEmpty(), "Expected empty reference: " + ref);
258+
assertFalse(ref.hasContent(), "Expected empty reference: " + ref);
273259
assertTrue(ref.isPreviewOnly(), "Expected preview-only: " + ref);
274260
}
275261
}

0 commit comments

Comments
 (0)