blob: 567fe184cced09c353be6ad51462e50f45887582 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.netbeans.modules.jackpot30.maven;
import java.io.File;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.model.Resource;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.netbeans.modules.jackpot30.cmdline.Main;
public abstract class RunJackpot30 extends AbstractMojo {
protected final void doRun(MavenProject project, boolean apply) throws MojoExecutionException, MojoFailureException {
try {
String sourceLevel = "1.5";
Xpp3Dom sourceLevelConfiguration = Utils.getPluginConfiguration(project, "org.apache.maven.plugins", "maven-compiler-plugin");
if (sourceLevelConfiguration != null) {
Xpp3Dom source = sourceLevelConfiguration.getChild("source");
if (source != null) {
sourceLevel = source.getValue();
}
}
String configurationFile = Utils.getJackpotConfigurationFile(project);
List<String> cmdLine = new ArrayList<String>();
if (apply)
cmdLine.add("--apply");
else
cmdLine.add("--no-apply");
cmdLine.addAll(sourceAndCompileClassPaths(Collections.singletonList(project)));
cmdLine.add("--source");
cmdLine.add(sourceLevel);
if (configurationFile != null) {
cmdLine.add("--config-file");
cmdLine.add(configurationFile);
}
boolean hasSourceRoots = false;
for (String sr : (List<String>) project.getCompileSourceRoots()) {
if (!hasSourceRoots && new File(sr).isDirectory()) {
hasSourceRoots = true;
}
cmdLine.add(sr);
}
if (!hasSourceRoots) {
getLog().debug("jackpot30 analyze: Not source roots to operate on");
return ;
}
Path bin = Paths.get(System.getProperty("java.home"))
.resolve("bin");
Path launcher = bin.resolve("java");
if (!Files.exists(launcher)) {
launcher = bin.resolve("java.exe");
}
cmdLine.addAll(0, Arrays.asList(launcher.toAbsolutePath().toString(),
"-classpath", Main.class.getProtectionDomain().getCodeSource().getLocation().getPath(),
"--add-exports=jdk.javadoc/com.sun.tools.javadoc.main=ALL-UNNAMED",
"--add-opens=java.base/java.net=ALL-UNNAMED",
"--add-opens=java.desktop/sun.awt=ALL-UNNAMED",
Main.class.getCanonicalName()));
new ProcessBuilder(cmdLine).inheritIO().start().waitFor();
} catch (IOException ex) {
throw new MojoExecutionException(ex.getMessage(), ex);
} catch (InterruptedException ex) {
throw new MojoExecutionException(ex.getMessage(), ex);
} catch (DependencyResolutionRequiredException ex) {
throw new MojoExecutionException(ex.getMessage(), ex);
}
}
private static String toClassPathString(List<String> entries) {
StringBuilder classPath = new StringBuilder();
for (String root : entries) {
if (classPath.length() > 0) classPath.append(File.pathSeparatorChar);
classPath.append(root);
}
return classPath.toString();
}
@SuppressWarnings("unchecked")
public static List<String> sourceAndCompileClassPaths(Iterable<? extends MavenProject> projects) throws DependencyResolutionRequiredException {
List<String> compileSourceRoots = new ArrayList<String>();
List<String> compileClassPath = new ArrayList<String>();
for (MavenProject project : projects) {
compileSourceRoots.addAll((List<String>) project.getCompileSourceRoots());
for (Resource r : (List<Resource>) project.getResources()) {
compileSourceRoots.add(r.getDirectory());
}
compileClassPath.addAll((List<String>) project.getCompileClasspathElements());
}
return Arrays.asList("--sourcepath",
toClassPathString(compileSourceRoots),
"--classpath",
toClassPathString(compileClassPath));
}
}