Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Let -h/--help display also mvnd specific options #243 #244

Merged
merged 4 commits into from
Dec 8, 2020
Merged
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
103 changes: 103 additions & 0 deletions build-plugin/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
<!--

Copyright 2019 the original author or authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

-->
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.mvndaemon.mvnd</groupId>
<artifactId>mvnd</artifactId>
<version>0.1.2-SNAPSHOT</version>
</parent>

<artifactId>mvnd-build-maven-plugin</artifactId>

<packaging>maven-plugin</packaging>
<name>Maven Daemon - Documentation Maven Plugin</name>

<properties>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>

<roaster.version>2.22.2.Final</roaster.version>
<maven.plugin-tools.version>3.6.0</maven.plugin-tools.version>
<maven-plugin-plugin.version>${maven.plugin-tools.version}</maven-plugin-plugin.version>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>${maven.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>${maven.plugin-tools.version}</version>
</dependency>

</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.jboss.forge.roaster</groupId>
<artifactId>roaster-jdt</artifactId>
<version>${roaster.version}</version>
</dependency>

</dependencies>

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>${maven-plugin-plugin.version}</version>
</plugin>
</plugins>
</pluginManagement>

<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<configuration>
<goalPrefix>mvnd-build</goalPrefix>
<mojoDependencies>
<dep>org.apache.maven:maven-plugin-api</dep>
</mojoDependencies>
</configuration>
</plugin>
</plugins>
</build>

</project>
184 changes: 184 additions & 0 deletions build-plugin/src/main/java/org/mvndaemon/mvnd/plugin/doc/DocMojo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
/*
* Copyright 2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mvndaemon.mvnd.plugin.doc;

import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.TreeSet;
import javax.security.sasl.SaslClientFactory;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
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.plugins.annotations.ResolutionScope;
import org.jboss.forge.roaster.Roaster;
import org.jboss.forge.roaster.model.source.EnumConstantSource;
import org.jboss.forge.roaster.model.source.JavaDocSource;
import org.jboss.forge.roaster.model.source.JavaEnumSource;

/**
* Extracts JavaDoc blocks from enum entries and stores them into a properties file.
*/
@Mojo(name = "doc", defaultPhase = LifecyclePhase.NONE, threadSafe = true, requiresProject = true, requiresDependencyResolution = ResolutionScope.NONE)
public class DocMojo extends AbstractMojo {

/**
* The current project's <code>${basedir}</code>
*/
@Parameter(readonly = true, defaultValue = "${project.basedir}")
File baseDir;

/** A list of fully qualified enum names to process */
@Parameter(defaultValue = "org.mvndaemon.mvnd.common.Environment,org.mvndaemon.mvnd.common.OptionType")
String[] enums;

/** If {@code true} the execution of this mojo will be skipped altogether; otherwise this mojo will be executed. */
@Parameter(defaultValue = "false", property = "mvnd.build.doc.skip")
boolean skip;

@Override
public void execute() throws MojoExecutionException, MojoFailureException {
final Log log = getLog();
if (skip) {
log.info(getClass().getSimpleName() + " skipped per skip parameter");
return;
}

final Path basePath = baseDir.toPath();

for (String enumClassName : enums) {
extractEnumJavaDoc(basePath, enumClassName);
}
}

static void extractEnumJavaDoc(Path basePath, String enumClassName) throws MojoFailureException {
final String classRelPath = enumClassName.replace('.', '/');
final Path enumClassLocation = basePath.resolve("src/main/java")
.resolve(classRelPath + ".java");
final Path propsPath = basePath.resolve("target/classes/" + classRelPath + ".javadoc.properties");
try {
Files.createDirectories(propsPath.getParent());
} catch (IOException e) {
throw new IllegalStateException("Could not create " + propsPath.getParent(), e);
}

if (!Files.isRegularFile(enumClassLocation)) {
throw new IllegalStateException(enumClassLocation + " does not exist: ");
}

try {
final JavaEnumSource source = Roaster.parse(JavaEnumSource.class, enumClassLocation.toFile());

final Properties optionsProperties = new SortedProperties();
for (EnumConstantSource enumConst : source.getEnumConstants()) {
final JavaDocSource<EnumConstantSource> javaDoc = enumConst.getJavaDoc();
final String javadocText = javaDoc.getText();
optionsProperties.setProperty(enumConst.getName(), javadocText);
}
optionsProperties.store(Files.newOutputStream(propsPath), null);
} catch (IOException e) {
throw new MojoFailureException("Could not parse " + enumClassLocation, e);
}
}

/**
* A {@link Properties} with a binarily reproducible {@code store()} operation.
*/
static class SortedProperties extends Properties {
private static final long serialVersionUID = 5983297690254771479L;

@Override
public synchronized Enumeration<Object> keys() {
final Iterator<Object> it = new TreeSet<>(keySet()).iterator();
return new Enumeration<Object>() {
public boolean hasMoreElements() {
return it.hasNext();
}

public Object nextElement() {
return (SaslClientFactory) it.next();
}
};
}

public Set<Map.Entry<Object, Object>> entrySet() {
Comparator<Map.Entry<Object, Object>> comparator = Comparator.comparing(e -> (Comparable) e.getKey());
final Set<Map.Entry<Object, Object>> result = new TreeSet<>(comparator);
result.addAll(super.entrySet());
return result;
}

@Override
public void store(Writer writer, String comments)
throws IOException {
super.store(new SkipFirstLineBufferedWriter(writer), null);
}

@Override
public void store(OutputStream out, String comments)
throws IOException {
this.store(new OutputStreamWriter(out, "8859_1"), comments);
}

static class SkipFirstLineBufferedWriter extends BufferedWriter {
private boolean firstLine = true;

public SkipFirstLineBufferedWriter(Writer out) {
super(out);
}

@Override
public void newLine() throws IOException {
if (firstLine) {
firstLine = false;
} else {
write('\n');
}
}

@Override
public void write(String s, int off, int len) throws IOException {
if (!firstLine) {
super.write(s, off, len);
}
}

@Override
public void write(char cbuf[], int off, int len) throws IOException {
if (!firstLine) {
super.write(cbuf, off, len);
}
}

}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -327,13 +327,13 @@ private Process startDaemon(String uid) {
args.add("-Xmx" + maxHeapSize);
}

args.add(Environment.MVND_HOME.asCommandLineProperty(mvndHome.toString()));
args.add(Environment.LOGBACK_CONFIGURATION_FILE
.asCommandLineProperty(parameters.logbackConfigurationPath().toString()));
args.add(Environment.MVND_UID.asCommandLineProperty(uid));
args.add(Environment.MVND_DAEMON_STORAGE.asCommandLineProperty(parameters.daemonStorage().toString()));
args.add(Environment.MVND_REGISTRY.asCommandLineProperty(parameters.registry().toString()));
args.addAll(parameters.getDaemonCommandLineProperties());
Environment.MVND_HOME.appendAsCommandLineOption(args::add, mvndHome.toString());
Environment.LOGBACK_CONFIGURATION_FILE
.appendAsCommandLineOption(args::add, parameters.logbackConfigurationPath().toString());
Environment.MVND_UID.appendAsCommandLineOption(args::add, uid);
Environment.MVND_DAEMON_STORAGE.appendAsCommandLineOption(args::add, parameters.daemonStorage().toString());
Environment.MVND_REGISTRY.appendAsCommandLineOption(args::add, parameters.registry().toString());
parameters.discriminatingCommandLineOptions(args::add);
args.add(MavenDaemon.class.getName());
command = String.join(" ", args);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
*/
public class DaemonDiagnostics {

private final static int TAIL_SIZE = 20;
private final static int TAIL_SIZE = 200;

private final String uid;
private final DaemonParameters parameters;
Expand Down
Loading