Skip to content

Commit ffe9556

Browse files
youngjin.kim2smilu97
youngjin.kim2
authored andcommitted
[#8890] Define ModuleLayer of 'pinpoint.module' explicitly
1 parent 8a09c7c commit ffe9556

File tree

4 files changed

+81
-4
lines changed

4 files changed

+81
-4
lines changed

bootstraps/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/module/Providers.java

+8
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ public String getService() {
3535
return services;
3636
}
3737

38+
public String getServicePackage() {
39+
int lastDotIndex = services.lastIndexOf('.');
40+
if (lastDotIndex == -1) {
41+
return services;
42+
}
43+
return services.substring(0, lastDotIndex);
44+
}
45+
3846
public List<String> getProviders() {
3947
return providers;
4048
}

bootstraps/bootstrap-java9-internal/src/main/java/com/navercorp/pinpoint/bootstrap/java9/module/InternalModules.java

+18-3
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,21 @@
1919
import jdk.internal.loader.BootLoader;
2020
import jdk.internal.module.Modules;
2121

22+
import java.lang.module.Configuration;
2223
import java.lang.module.ModuleDescriptor;
24+
import java.lang.module.ModuleFinder;
2325
import java.net.URI;
26+
import java.util.List;
27+
import java.util.Objects;
28+
import java.util.Set;
2429

2530
final class InternalModules {
2631

2732
private InternalModules() {
2833
}
2934

3035
/**
31-
* Returns the unnamed module for the boot loader.
36+
* Returns the unnamed module for the bootloader.
3237
*/
3338
static Module getUnnamedModule() {
3439
return BootLoader.getUnnamedModule();
@@ -47,14 +52,24 @@ static Module defineModule(ClassLoader loader,
4752
ModuleDescriptor descriptor,
4853
URI uri)
4954
{
50-
return Modules.defineModule(loader, descriptor, uri);
55+
final String moduleName = descriptor.name();
56+
final ModuleLayer parent = ModuleLayer.boot();
57+
58+
final ModuleFinder before = new SingleModuleFinder(descriptor, uri);
59+
final Configuration cf = parent.configuration().resolve(before, ModuleFinder.of(), Set.of(moduleName));
60+
final Module module = ModuleLayer.defineModules(cf, List.of(parent), name -> loader)
61+
.layer()
62+
.findModule(moduleName)
63+
.orElse(null);
64+
65+
return Objects.requireNonNull(module, moduleName);
5166
}
5267

5368

5469
/**
5570
* Called by the VM to load a system module, typically "java.instrument" or
5671
* "jdk.management.agent". If the module is not loaded then it is resolved
57-
* and loaded (along with any dependences that weren't previously loaded)
72+
* and loaded (along with any dependencies that weren't previously loaded)
5873
* into a child layer.
5974
*/
6075
static Module loadModule(String name) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* Copyright 2022 NAVER Corp.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.navercorp.pinpoint.bootstrap.java9.module;
17+
18+
import java.lang.module.ModuleDescriptor;
19+
import java.lang.module.ModuleFinder;
20+
import java.lang.module.ModuleReader;
21+
import java.lang.module.ModuleReference;
22+
import java.net.URI;
23+
import java.util.Optional;
24+
import java.util.Set;
25+
26+
/**
27+
* @author youngjin.kim2
28+
*/
29+
public class SingleModuleFinder implements ModuleFinder {
30+
private final ModuleReference target;
31+
32+
public SingleModuleFinder(ModuleDescriptor descriptor, URI uri) {
33+
this.target = new ModuleReference(descriptor, uri) {
34+
@Override
35+
public ModuleReader open() {
36+
throw new RuntimeException("open must not be called");
37+
}
38+
};
39+
}
40+
41+
@Override
42+
public Optional<ModuleReference> find(String name) {
43+
if (target.descriptor().name().equals(name)) {
44+
return Optional.of(target);
45+
}
46+
return Optional.empty();
47+
}
48+
49+
@Override
50+
public Set<ModuleReference> findAll() {
51+
return Set.of(target);
52+
}
53+
}

bootstraps/bootstrap-java9/src/main/java/com/navercorp/pinpoint/bootstrap/java9/module/JarFileAnalyzer.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public PackageInfo analyze() {
6868

6969
final Providers provides = this.serviceLoaderEntryFilter.filter(jarEntry);
7070
if (provides != null) {
71+
packageSet.add(provides.getServicePackage());
7172
providesList.add(provides);
7273
}
7374
}
@@ -124,7 +125,7 @@ public String filter(JarEntry jarEntry) {
124125

125126
final String fileName = jarEntry.getName();
126127
if (!checkFIleExtension(fileName, CLASS_EXTENSION)) {
127-
// skip non class file
128+
// skip non-class file
128129
return null;
129130
}
130131

0 commit comments

Comments
 (0)