package com.intellij.flex.maven;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Resource;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.PluginParameterExpressionEvaluator;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
import org.codehaus.plexus.logging.Logger;
import java.io.File;
public final class AdditionalSourceRootUtil {
public static void addByUnknownGeneratorMojo(MavenProject project) {
// IDEA-58453
File generatedSources = new File(project.getBuild().getDirectory(), "/generated-sources");
if (generatedSources.isDirectory()) {
File[] files = generatedSources.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory() && !file.isHidden()) {
addCompilerSourceRoot(project, file);
}
}
}
}
}
private static void addCompilerSourceRoot(MavenProject project, File file) {
String filename = file.getAbsolutePath();
if (!project.getCompileSourceRoots().contains(filename)) {
project.addCompileSourceRoot(filename);
}
}
private static Object evaluate(ExpressionEvaluator expressionEvaluator, String value, Logger logger) {
try {
return expressionEvaluator.evaluate(value);
}
catch (ExpressionEvaluationException e) {
logger.error("Can't evaluate " + value, e);
return null;
}
}
public static void addResourcesAsCompileSourceRoots(MavenProject project) {
for (Resource resource : project.getResources()) {
File resourceFolder = new File(resource.getDirectory());
if (resourceFolder.exists() && resourceFolder.isDirectory()) {
addCompilerSourceRoot(project, resourceFolder);
}
}
}
public static void addByBuildHelper(MojoExecution mojoExecution, MavenSession session, MavenProject project, Logger logger) {
final PlexusConfiguration parentConfiguration = new XmlPlexusConfiguration(mojoExecution.getConfiguration());
final PlexusConfiguration configuration = parentConfiguration.getChild("sources");
if (configuration == null) {
return;
}
final PlexusConfiguration[] sources = configuration.getChildren();
if (sources == null) {
return;
}
final ExpressionEvaluator expressionEvaluator = new PluginParameterExpressionEvaluator(session, mojoExecution);
for (PlexusConfiguration source : sources) {
addFile(evaluate(expressionEvaluator, source.getValue(), logger), project, expressionEvaluator);
}
}
public static void addByGeneratorMojo(MojoExecution mojoExecution, MavenSession session, MavenProject project, Logger logger) {
final PluginParameterExpressionEvaluator expressionEvaluator = new PluginParameterExpressionEvaluator(session, mojoExecution);
final PlexusConfiguration configuration = new XmlPlexusConfiguration(mojoExecution.getConfiguration());
for (String parameterName : new String[]{"baseOutputDirectory", "outputDirectory"}) {
collectGeneratedSource(configuration, parameterName, project, expressionEvaluator, logger);
}
}
private static void collectGeneratedSource(PlexusConfiguration parentConfiguration, String parameterName, MavenProject project, PluginParameterExpressionEvaluator expressionEvaluator, Logger logger) {
final PlexusConfiguration configuration = parentConfiguration.getChild(parameterName);
if (configuration == null) {
return;
}
String filepath = configuration.getValue();
if (filepath == null) {
final String defaultValue = configuration.getAttribute("default-value");
if (defaultValue == null) {
return;
}
filepath = (String)evaluate(expressionEvaluator, defaultValue, logger);
}
if (filepath != null) {
addFile(filepath, project, expressionEvaluator);
}
}
private static void addFile(Object path, MavenProject project, ExpressionEvaluator expressionEvaluator) {
if (path == null) {
return;
}
addCompilerSourceRoot(project, expressionEvaluator.alignToBaseDirectory(new File((String)path)));
}
}