Skip to content

Commit b322207

Browse files
Fix ReflectedEngine
1 parent 3c0d38e commit b322207

File tree

3 files changed

+44
-45
lines changed

3 files changed

+44
-45
lines changed

maven-plugins/helidon-archetype-maven-plugin/src/main/java/io/helidon/build/maven/archetype/postgenerate/EngineFacade.java

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ private EngineFacade() {
5858
/**
5959
* Generate a project.
6060
*
61-
* @param request archetype generation request
61+
* @param request archetype generation request
6262
* @param dependencies Maven coordinates to resolve for running the engine
6363
*/
6464
@SuppressWarnings("unused")
@@ -99,14 +99,14 @@ public static void generate(ArchetypeGenerationRequest request, List<String> dep
9999

100100
// create a class-loader with the engine dependencies
101101
URL[] urls = aether.resolveDependencies(dependencies)
102-
.stream()
103-
.map(f -> {
104-
try {
105-
return f.toURI().toURL();
106-
} catch (MalformedURLException e) {
107-
throw new UncheckedIOException(e);
108-
}
109-
}).toArray(URL[]::new);
102+
.stream()
103+
.map(f -> {
104+
try {
105+
return f.toURI().toURL();
106+
} catch (MalformedURLException e) {
107+
throw new UncheckedIOException(e);
108+
}
109+
}).toArray(URL[]::new);
110110

111111
URLClassLoader ecl = new URLClassLoader(urls, EngineFacade.class.getClassLoader());
112112

@@ -119,13 +119,19 @@ public static void generate(ArchetypeGenerationRequest request, List<String> dep
119119
"jar", request.getArchetypeVersion());
120120

121121
try {
122-
FileSystem fileSystem = FileSystems.newFileSystem(archetypeFile.toPath(), EngineFacade.class.getClassLoader());
122+
// delete the dummy pom.xml
123123
Path projectDir = Paths.get(request.getOutputDirectory()).resolve(request.getArtifactId());
124124
Files.delete(projectDir.resolve("pom.xml"));
125-
boolean interactiveMode = !"false".equals(System.getProperty("interactiveMode"));
126-
new ReflectedEngine(ecl, fileSystem, interactiveMode, props, emptyMap(), () -> projectDir).generate();
125+
126+
// generate the project
127+
try (FileSystem fileSystem = FileSystems.newFileSystem(archetypeFile.toPath(), EngineFacade.class.getClassLoader())) {
128+
for (Path root : fileSystem.getRootDirectories()) {
129+
boolean interactiveMode = !"false".equals(System.getProperty("interactiveMode"));
130+
new ReflectedEngine(ecl, root, interactiveMode, props, emptyMap(), () -> projectDir).generate();
131+
}
132+
}
127133
} catch (IOException ioe) {
128-
throw new IllegalStateException(ioe);
134+
throw new UncheckedIOException(ioe);
129135
}
130136
}
131137

@@ -170,7 +176,7 @@ private static void checkJavaVersion() {
170176
@SuppressWarnings("unchecked")
171177
private static <T> Optional<T> invoke(Object object, String methodName) {
172178
try {
173-
Method method = object.getClass().getMethod(methodName);
179+
Method method = object.getClass().getMethod(methodName);
174180
return Optional.ofNullable((T) method.invoke(object));
175181
} catch (NoSuchMethodException ex) {
176182
return Optional.empty();

maven-plugins/helidon-archetype-maven-plugin/src/main/java/io/helidon/build/maven/archetype/postgenerate/ReflectedEngine.java

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,8 @@
1515
*/
1616
package io.helidon.build.maven.archetype.postgenerate;
1717

18-
import java.lang.reflect.Constructor;
1918
import java.lang.reflect.InvocationTargetException;
2019
import java.lang.reflect.Method;
21-
import java.nio.file.FileSystem;
2220
import java.nio.file.Path;
2321
import java.util.Map;
2422
import java.util.function.Supplier;
@@ -38,40 +36,30 @@ final class ReflectedEngine {
3836
* Create a new engine.
3937
*
4038
* @param cl class loader
41-
* @param fileSystem archetype file system
39+
* @param cwd cwd
4240
* @param isInteractive {@code true} if interactive
4341
* @param externalValues external values
4442
* @param externalDefaults external defaults
4543
* @param dirSupplier directory supplier
4644
*/
4745
ReflectedEngine(ClassLoader cl,
48-
FileSystem fileSystem,
46+
Path cwd,
4947
boolean isInteractive,
5048
Map<String, String> externalValues,
5149
Map<String, String> externalDefaults,
5250
Supplier<Path> dirSupplier) {
5351
try {
5452
Class<?> engineClass = cl.loadClass(ENGINE_FCN);
55-
Class<?> engineBuilderClass = cl.loadClass(ENGINE_FCN_BUILDER);
56-
Constructor<?> builderClassConstructor = engineBuilderClass.getDeclaredConstructor();
57-
builderClassConstructor.setAccessible(true);
58-
Object builder = builderClassConstructor.newInstance();
59-
engineBuilderClass.getDeclaredMethod("output", Supplier.class)
60-
.invoke(builder, dirSupplier);
61-
engineBuilderClass.getDeclaredMethod("externalDefaults", Map.class)
62-
.invoke(builder, externalDefaults);
63-
engineBuilderClass.getDeclaredMethod("externalValues", Map.class)
64-
.invoke(builder, externalValues);
65-
engineBuilderClass.getDeclaredMethod("batch", boolean.class)
66-
.invoke(builder, !isInteractive);
67-
engineBuilderClass.getDeclaredMethod("fileSystem", FileSystem.class)
68-
.invoke(builder, fileSystem);
69-
Constructor<?> constructor = engineClass.getDeclaredConstructor(engineBuilderClass);
70-
constructor.setAccessible(true);
71-
engineInstance = constructor.newInstance(builder);
53+
Class<?> builderClass = cl.loadClass(ENGINE_FCN_BUILDER);
54+
Object builder = engineClass.getDeclaredMethod("builder").invoke(null);
55+
builderClass.getDeclaredMethod("output", Supplier.class).invoke(builder, dirSupplier);
56+
builderClass.getDeclaredMethod("externalDefaults", Map.class).invoke(builder, externalDefaults);
57+
builderClass.getDeclaredMethod("externalValues", Map.class).invoke(builder, externalValues);
58+
builderClass.getDeclaredMethod("batch", boolean.class).invoke(builder, !isInteractive);
59+
builderClass.getDeclaredMethod("cwd", Path.class).invoke(builder, cwd);
60+
engineInstance = builderClass.getDeclaredMethod("build").invoke(builder);
7261
generateMethod = engineClass.getDeclaredMethod("generate");
73-
} catch (InstantiationException
74-
| IllegalAccessException
62+
} catch (IllegalAccessException
7563
| NoSuchMethodException
7664
| ClassNotFoundException ex) {
7765
throw new IllegalStateException(ex);

maven-plugins/helidon-archetype-maven-plugin/src/test/java/io/helidon/build/maven/archetype/postgenerate/ReflectedEngineTest.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,20 @@ class ReflectedEngineTest {
4040
@Test
4141
void testGenerate() throws IOException {
4242
Path targetDir = targetDir(this.getClass());
43-
Path sourceDir = targetDir.resolve("test-classes/simple");
44-
Path outputDir = targetDir.resolve("reflected-engine-ut");
45-
FileSystem fs = VirtualFileSystem.create(sourceDir);
46-
Map<String, String> externalValues = Map.of("color", "red", "artifactId", "testGenerate");
47-
ReflectedEngine engine = new ReflectedEngine(
48-
this.getClass().getClassLoader(), fs, false,
49-
externalValues, Map.of(), () -> unique(outputDir, "testGenerate"));
50-
Path projectDir = engine.generate();
43+
Path projectDir = generate(targetDir.resolve("test-classes/simple"), targetDir.resolve("reflected-engine-ut"));
5144
assertThat(Files.exists(projectDir.resolve("color.txt")), is(true));
5245
assertThat(normalizeNewLines(readString(projectDir.resolve("color.txt"))), is("red\n"));
5346
}
47+
48+
static Path generate(Path sourceDir, Path outputDir) throws IOException {
49+
try (FileSystem fs = VirtualFileSystem.create(sourceDir)) {
50+
Path root = fs.getRootDirectories().iterator().next();
51+
Map<String, String> externalValues = Map.of("color", "red", "artifactId", "testGenerate");
52+
ReflectedEngine engine = new ReflectedEngine(
53+
ReflectedEngineTest.class.getClassLoader(), root, false,
54+
externalValues, Map.of(), () -> unique(outputDir, "testGenerate"));
55+
56+
return engine.generate();
57+
}
58+
}
5459
}

0 commit comments

Comments
 (0)