package de.neitzel.fxdesigner.maven; import java.nio.file.*; import java.util.*; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.*; import org.apache.maven.project.MavenProject; /** Runs after package in Maven's process; no application class is loaded into a designer host. */ @Mojo(name = "capture", requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true) public final class CaptureMojo extends AbstractMojo { @Parameter(defaultValue = "${project}", readonly = true, required = true) private MavenProject project; @Parameter(defaultValue = "${session}", readonly = true, required = true) private MavenSession session; @Parameter(property = "designer.captureDir", required = true) private java.io.File directory; public void execute() throws MojoExecutionException { try { var proof = new Properties(); try (var in = Files.newInputStream( directory.toPath().resolve(DependencyProof.id(project) + ".dependencies"))) { proof.load(in); } DependencyProof.verify(proof); var p = new Properties(); p.putAll(proof); p.setProperty("format", "2"); p.setProperty("module", project.getBasedir().getCanonicalPath()); p.setProperty( "coordinates", project.getGroupId() + ":" + project.getArtifactId() + ":" + project.getVersion()); p.setProperty("packaging", project.getPackaging()); list(p, "runtime", project.getRuntimeClasspathElements()); list(p, "test", project.getTestClasspathElements()); var roots = new ArrayList(project.getCompileSourceRoots()); roots.addAll(project.getTestCompileSourceRoots()); project.getResources().forEach(r -> roots.add(r.getDirectory())); project.getTestResources().forEach(r -> roots.add(r.getDirectory())); list(p, "sources", roots); var dependencies = new ArrayList(); for (var a : project.getArtifacts()) for (var other : session.getProjects()) if (a.getGroupId().equals(other.getGroupId()) && a.getArtifactId().equals(other.getArtifactId()) && a.getVersion().equals(other.getVersion())) dependencies.add(other.getBasedir().getCanonicalPath()); list(p, "dependencies", dependencies); list(p, "profiles", session.getRequest().getActiveProfiles()); Files.createDirectories(directory.toPath()); String id = HexFormat.of() .formatHex( java.security.MessageDigest.getInstance("SHA-256") .digest( project .getBasedir() .getCanonicalPath() .getBytes(java.nio.charset.StandardCharsets.UTF_8))); try (var out = Files.newOutputStream(directory.toPath().resolve(id + ".properties"))) { p.store(out, "Neitzel FX Designer effective Maven capture"); } } catch (Exception e) { throw new MojoExecutionException("Cannot capture effective Maven metadata", e); } } private static void list(Properties p, String name, List values) { p.setProperty(name + ".count", Integer.toString(values.size())); for (int i = 0; i < values.size(); i++) p.setProperty(name + "." + i, values.get(i)); } }