package org.jnario.m2e;
import static org.eclipse.xtext.builder.EclipseOutputConfigurationProvider.*;
import static org.eclipse.xtext.builder.preferences.BuilderPreferenceAccess.getIgnoreSourceFolderKey;
import static org.eclipse.xtext.builder.preferences.BuilderPreferenceAccess.getKey;
import static org.eclipse.xtext.builder.preferences.BuilderPreferenceAccess.getOutputForSourceFolderKey;
import java.io.File;
import java.io.IOException;
import java.util.Set;
import org.apache.maven.plugin.MojoExecution;
import org.codehaus.plexus.util.StringUtils;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.m2e.core.project.configurator.AbstractProjectConfigurator;
import org.eclipse.m2e.core.project.configurator.ProjectConfigurationRequest;
import org.eclipse.xtext.generator.IFileSystemAccess;
import org.eclipse.xtext.generator.OutputConfiguration;
import org.eclipse.xtext.generator.OutputConfiguration.SourceMapping;
import org.eclipse.xtext.ui.XtextProjectHelper;
import org.eclipse.xtext.ui.preferences.OptionsConfigurationBlock;
import org.eclipse.xtext.util.RuntimeIOException;
import org.jnario.doc.DocOutputConfigurationProvider;
import org.osgi.service.prefs.BackingStoreException;
import com.google.common.base.CharMatcher;
import com.google.common.base.Strings;
public class JnarioProjectConfigurator extends AbstractProjectConfigurator {
@Override
public void configure(ProjectConfigurationRequest request,
IProgressMonitor monitor) throws CoreException {
addNature(request.getProject(), XtextProjectHelper.NATURE_ID, monitor);
Set<OutputConfiguration> configurations = new DocOutputConfigurationProvider()
.getOutputConfigurations();
for (OutputConfiguration configuration : configurations) {
for (MojoExecution execution : getMojoExecutions(request, monitor)) {
String goal = execution.getGoal();
if (goal.equals("generate")) {
readDocGenerateSettings(configuration, request, execution);
} else if (goal.equals("testCompile")) {
readCompileSettings(configuration, request, execution);
} else if (goal.equals("xtend-test-install-debug-info")) {
readEnhanceSettings(configuration, request, execution);
}
}
}
writePreferences(configurations, request.getProject());
}
private void writePreferences(Set<OutputConfiguration> configurations,
IProject project) {
ProjectScope projectPreferences = new ProjectScope(project);
IEclipsePreferences languagePreferences = projectPreferences
.getNode("org.jnario.Jnario");
for (OutputConfiguration configuration : configurations) {
languagePreferences.putBoolean(
OptionsConfigurationBlock.IS_PROJECT_SPECIFIC, true);
if (isJavaOutput(configuration)) {
languagePreferences.putBoolean(
getKey(configuration, INSTALL_DSL_AS_PRIMARY_SOURCE),
configuration.isInstallDslAsPrimarySource());
languagePreferences.putBoolean(
getKey(configuration, HIDE_LOCAL_SYNTHETIC_VARIABLES),
configuration.isHideSyntheticLocalVariables());
}
languagePreferences.putBoolean(
getKey(configuration, USE_OUTPUT_PER_SOURCE_FOLDER), true);
for (SourceMapping sourceMapping : configuration
.getSourceMappings()) {
languagePreferences.put(
getOutputForSourceFolderKey(configuration,
sourceMapping.getSourceFolder()), sourceMapping
.getOutputDirectory());
}
try {
languagePreferences.flush();
} catch (BackingStoreException e) {
throw new RuntimeIOException(e);
}
}
}
private void readDocGenerateSettings(OutputConfiguration config,
ProjectConfigurationRequest request, MojoExecution execution)
throws CoreException {
if (!isJavaOutput(config)) {
for (String source : request.getMavenProject()
.getTestCompileSourceRoots()) {
SourceMapping mapping = new SourceMapping(makeProjectRelative(
source, request));
String docOutputDirectory = getParameterValue(
"docOutputDirectory", String.class,
request.getMavenSession(), execution);
mapping.setOutputDirectory(makeProjectRelative(
docOutputDirectory, request));
config.getSourceMappings().add(mapping);
}
}
}
private void readCompileSettings(OutputConfiguration config,
ProjectConfigurationRequest request, MojoExecution execution)
throws CoreException {
if (isJavaOutput(config)) {
for (String source : request.getMavenProject()
.getTestCompileSourceRoots()) {
SourceMapping mapping = new SourceMapping(makeProjectRelative(
source, request));
String testOutputDirectory = getParameterValue(
"testOutputDirectory", String.class,
request.getMavenSession(), execution);
mapping.setOutputDirectory(makeProjectRelative(
testOutputDirectory, request));
config.getSourceMappings().add(mapping);
}
}
}
private void readEnhanceSettings(OutputConfiguration config,
ProjectConfigurationRequest request, MojoExecution execution)
throws CoreException {
if (isJavaOutput(config)) {
config.setHideSyntheticLocalVariables(getParameterValue(
"hideSyntheticVariables", Boolean.class,
request.getMavenSession(), execution));
config.setInstallDslAsPrimarySource(getParameterValue(
"xtendAsPrimaryDebugSource", Boolean.class,
request.getMavenSession(), execution));
}
}
private boolean isJavaOutput(OutputConfiguration config) {
return config.getName().equals(IFileSystemAccess.DEFAULT_OUTPUT);
}
private String makeProjectRelative(String fileName,
ProjectConfigurationRequest request) {
File baseDir = request.getMavenProject().getBasedir();
File file = new File(fileName);
String relativePath;
if (file.isAbsolute()) {
relativePath = baseDir.toURI().relativize(file.toURI()).getPath();
} else {
relativePath = file.getPath();
}
String unixDelimited = relativePath.replaceAll("\\\\", "/");
return CharMatcher.is('/').trimFrom(unixDelimited);
}
}