/* * The contents of this file are subject to the terms of the Common Development and * Distribution License (the License). You may not use this file except in compliance with the * License. * * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the * specific language governing permission and limitations under the License. * * When distributing Covered Software, include this CDDL Header Notice in each file and include * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL * Header, with the fields enclosed by brackets [] replaced by your own identifying * information: "Portions Copyright [year] [name of copyright owner]". * * Copyright 2015-2016 ForgeRock AS. */ package org.forgerock.opendj.maven.doc; import static org.forgerock.opendj.maven.doc.Utils.*; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.LinkedList; import java.util.List; /** * Generates the configuration reference, a set of HTML documents describing the server configuration. */ @Mojo(name = "generate-config-ref", defaultPhase = LifecyclePhase.PRE_SITE) public class GenerateConfigurationReferenceMojo extends AbstractMojo { /** * The Maven Project. */ @Parameter(property = "project", readonly = true, required = true) private MavenProject project; /** * The path to the directory where the configuration reference should be written. * This path must be under ${project.build.directory}. */ @Parameter(defaultValue = "${project.build.directory}/site/configref") private String outputDirectory; /** * Generates the configuration reference under the output directory. * @throws MojoExecutionException Generation failed * @throws MojoFailureException Not used */ @Override public void execute() throws MojoExecutionException, MojoFailureException { createOutputDirectory(); generateConfigRef(); try { copyResources(); } catch (IOException e) { throw new MojoExecutionException("Failed to copy resource files.", e); } } /** * Creates the output directory where the configuration reference is written. * @throws MojoExecutionException The output directory is not under ${project.build.directory} * or could not be created. */ private void createOutputDirectory() throws MojoExecutionException { String projectBuildDir = project.getBuild().getDirectory(); if (!outputDirectory.contains(projectBuildDir)) { String errorMsg = String.format( "The outputDirectory (%s) must be under the ${project.build.directory} (%s).", outputDirectory, projectBuildDir); getLog().error(errorMsg); throw new MojoExecutionException(errorMsg); } try { createDirectory(outputDirectory); } catch (IOException e) { getLog().error(e.getMessage()); throw new MojoExecutionException(e.getMessage(), e); } } /** * Runs the configuration reference generator class. * @throws MojoExecutionException Failed to run the generator */ private void generateConfigRef() throws MojoExecutionException { String generatorClass = "org.opends.server.admin.doc.ConfigGuideGeneration"; List commands = new LinkedList<>(); try { commands.add(getJavaCommand()); commands.add("-classpath"); commands.add(getClassPath(getRuntimeClassLoader(project, getLog()))); commands.add("-DGenerationDir=" + outputDirectory); commands.add(generatorClass); } catch (Exception e) { throw new MojoExecutionException("Failed to set the classpath.", e); } try { ProcessBuilder builder = new ProcessBuilder(commands); Process process = builder.start(); process.waitFor(); final int result = process.exitValue(); if (result != 0) { final StringBuilder message = new StringBuilder(); message.append("Failed to generate the config ref. Exit code: ").append(result).append(EOL) .append("To debug the problem, run the following command and connect your IDE:").append(EOL); commands.add(1, "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000"); for (String arg: commands) { message.append(arg).append(' '); } message.append(EOL); throw new MojoExecutionException(message.toString()); } } catch (InterruptedException e) { throw new MojoExecutionException(generatorClass + " interrupted", e); } catch (IOException e) { throw new MojoExecutionException(generatorClass + " not found", e); } } /** List of static file resources needed by the configuration reference. */ private static String[] resourceFiles = { "duration-syntax.html", "opendj-config.css", "opendj_logo_sm.png", "pageaction.gif", "tab_deselected.jpg", "tab_selected.gif" }; /** * Copies static files needed by the configuration reference. * @throws IOException Failed to read a resource or to write a file */ private void copyResources() throws IOException { for (String file : resourceFiles) { InputStream original = this.getClass().getResourceAsStream("/config-ref/" + file); File copy = new File(outputDirectory, file); copyInputStreamToFile(original, copy); } } }