Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions plexus-java/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@
<version>9.10.1</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.qdox</groupId>
<artifactId>qdox</artifactId>
<version>2.2.0</version>
<groupId>com.github.javaparser</groupId>
<artifactId>javaparser-core</artifactId>
<version>3.28.2</version>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,87 +19,88 @@
* under the License.
*/

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import com.thoughtworks.qdox.JavaProjectBuilder;
import com.thoughtworks.qdox.model.JavaClass;
import com.thoughtworks.qdox.model.JavaModule;
import com.thoughtworks.qdox.model.JavaModuleDescriptor;
import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.expr.Name;
import com.github.javaparser.ast.modules.ModuleDeclaration;
import com.github.javaparser.ast.modules.ModuleDirective;
import com.github.javaparser.ast.modules.ModuleExportsDirective;
import com.github.javaparser.ast.modules.ModuleProvidesDirective;
import com.github.javaparser.ast.modules.ModuleRequiresDirective;
import com.github.javaparser.ast.modules.ModuleUsesDirective;

/**
* Extract information from module with QDox
* Extracts information from a source module descriptor.
*
* @author Robert Scholte
* @since 1.0.0
*/
class SourceModuleInfoParser {

public org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor fromSourcePath(Path modulePath)
throws IOException {
File moduleDescriptor = modulePath.toFile();
public JavaModuleDescriptor fromSourcePath(Path modulePath) throws IOException {
JavaModuleDescriptor.Builder builder;
if (Files.exists(modulePath)) {
ModuleDeclaration descriptor = StaticJavaParser.parse(modulePath)
.getModule()
.orElseThrow(() -> new IOException("Module declaration not found in " + modulePath));

org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.Builder builder;
if (moduleDescriptor.exists()) {
JavaModuleDescriptor descriptor = new JavaProjectBuilder()
.addSourceFolder(moduleDescriptor.getParentFile())
.getDescriptor();
builder = JavaModuleDescriptor.newModule(descriptor.getName().asString());

builder = org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.newModule(descriptor.getName());

for (JavaModuleDescriptor.JavaRequires requires : descriptor.getRequires()) {
if (requires.isStatic() || requires.isTransitive()) {
Set<org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.JavaRequires.JavaModifier>
modifiers = new LinkedHashSet<>(2);
if (requires.isStatic()) {
modifiers.add(
org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.JavaRequires.JavaModifier
.STATIC);
}
if (requires.isTransitive()) {
modifiers.add(
org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.JavaRequires.JavaModifier
.TRANSITIVE);
for (ModuleDirective directive : descriptor.getDirectives()) {
if (directive instanceof ModuleRequiresDirective) {
addRequires(builder, (ModuleRequiresDirective) directive);
} else if (directive instanceof ModuleExportsDirective) {
addExports(builder, (ModuleExportsDirective) directive);
} else if (directive instanceof ModuleUsesDirective) {
ModuleUsesDirective uses = (ModuleUsesDirective) directive;
builder.uses(uses.getName().asString());
} else if (directive instanceof ModuleProvidesDirective) {
ModuleProvidesDirective provides = (ModuleProvidesDirective) directive;
List<String> providers = new ArrayList<>(provides.getWith().size());
for (Name provider : provides.getWith()) {
providers.add(provider.asString());
}
builder.requires(modifiers, requires.getModule().getName());
} else {
builder.requires(requires.getModule().getName());
builder.provides(provides.getName().asString(), providers);
}
}
} else {
builder = JavaModuleDescriptor.newAutomaticModule(null);
}

for (JavaModuleDescriptor.JavaExports exports : descriptor.getExports()) {
if (exports.getTargets().isEmpty()) {
builder.exports(exports.getSource().getName());
} else {
Set<String> targets = new LinkedHashSet<>();
for (JavaModule module : exports.getTargets()) {
targets.add(module.getName());
}
builder.exports(exports.getSource().getName(), targets);
}
}
return builder.build();
}

for (JavaModuleDescriptor.JavaUses uses : descriptor.getUses()) {
builder.uses(uses.getService().getName());
private static void addRequires(JavaModuleDescriptor.Builder builder, ModuleRequiresDirective requires) {
if (requires.isStatic() || requires.isTransitive()) {
Set<JavaModuleDescriptor.JavaRequires.JavaModifier> modifiers = new LinkedHashSet<>(2);
if (requires.isStatic()) {
modifiers.add(JavaModuleDescriptor.JavaRequires.JavaModifier.STATIC);
}

for (JavaModuleDescriptor.JavaProvides provides : descriptor.getProvides()) {
List<String> providers = new ArrayList<>(provides.getProviders().size());
for (JavaClass provider : provides.getProviders()) {
providers.add(provider.getName());
}

builder.provides(provides.getService().getName(), providers);
if (requires.isTransitive()) {
modifiers.add(JavaModuleDescriptor.JavaRequires.JavaModifier.TRANSITIVE);
}
builder.requires(modifiers, requires.getName().asString());
} else {
builder = org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.newAutomaticModule(null);
builder.requires(requires.getName().asString());
}
}

return builder.build();
private static void addExports(JavaModuleDescriptor.Builder builder, ModuleExportsDirective exports) {
if (exports.getModuleNames().isEmpty()) {
builder.exports(exports.getName().asString());
} else {
Set<String> targets = new LinkedHashSet<>();
for (Name module : exports.getModuleNames()) {
targets.add(module.asString());
}
builder.exports(exports.getName().asString(), targets);
}
}
}
2 changes: 1 addition & 1 deletion plexus-java/src/main/java9/module-info.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
* under the License.
*/
module org.codehaus.plexus.languages.java {
requires com.thoughtworks.qdox;
requires com.github.javaparser.core;
requires org.objectweb.asm;

exports org.codehaus.plexus.languages.java.jpms;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,15 @@ class LocationManagerIT {
private BinaryModuleInfoParser asmParser;

@Mock
private SourceModuleInfoParser qdoxParser;
private SourceModuleInfoParser sourceParser;

private LocationManager locationManager;

final Path mockModuleInfoJava = Paths.get("src/test/test-data/mock/module-info.java");

@BeforeEach
void onSetup() {
locationManager = new LocationManager(qdoxParser) {
locationManager = new LocationManager(sourceParser) {
@Override
ModuleInfoParser getBinaryModuleInfoParser(Path jdkHome) {
return asmParser;
Expand All @@ -70,7 +70,7 @@ void manifestWithoutReflectRequires() throws Exception {
Path abc = Paths.get("src/test/test-data/manifest.without/out");
JavaModuleDescriptor descriptor =
JavaModuleDescriptor.newModule("base").requires("any").build();
when(qdoxParser.fromSourcePath(any(Path.class))).thenReturn(descriptor);
when(sourceParser.fromSourcePath(any(Path.class))).thenReturn(descriptor);
ResolvePathsRequest<Path> request =
ResolvePathsRequest.ofPaths(Collections.singletonList(abc)).setMainModuleDescriptor(mockModuleInfoJava);

Expand All @@ -88,7 +88,7 @@ void emptyWithReflectRequires() throws Exception {
Path abc = Paths.get("src/test/test-data/empty/out");
JavaModuleDescriptor descriptor =
JavaModuleDescriptor.newModule("base").requires("a.b.c").build();
when(qdoxParser.fromSourcePath(any(Path.class))).thenReturn(descriptor);
when(sourceParser.fromSourcePath(any(Path.class))).thenReturn(descriptor);
ResolvePathsRequest<Path> request =
ResolvePathsRequest.ofPaths(Collections.singletonList(abc)).setMainModuleDescriptor(mockModuleInfoJava);

Expand Down
Loading
Loading