package com.github.jarlakxen.scala.sbt.jobs;
import java.io.InputStream;
import java.util.Properties;
import org.apache.commons.io.IOUtils;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunch;
import com.github.jarlakxen.scala.sbt.SbtPlugin;
import com.github.jarlakxen.scala.sbt.SbtProjectConfiguration;
import com.github.jarlakxen.scala.sbt.SbtVersion;
import com.github.jarlakxen.scala.sbt.action.MigrateAction;
import com.github.jarlakxen.scala.sbt.action.UpdateProjectConfigurationAction;
import com.github.jarlakxen.scala.sbt.builder.TemplateBuilder;
import com.github.jarlakxen.scala.sbt.configurations.MigrateToSbtProjectConfiguration;
import com.github.jarlakxen.scala.sbt.wizard.migrate.MigrationWizardPage;
/**
* Job that migrate the SBT project.
*
* @see MigrationWizardPage
* @see MigrateAction
* @author Facundo Viale
*/
public class MigrateToSbtProjectJob extends WorkspaceJob {
private MigrateToSbtProjectConfiguration configuration;
public MigrateToSbtProjectJob(MigrateToSbtProjectConfiguration configuration) {
super("Create a New SBT Project");
this.configuration = configuration;
}
@Override
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
try {
monitor.beginTask("Migrate Project to ScalaIDE", 5);
IProject project = configuration.getProject();
// add natures
monitor.setTaskName("Adding natures...");
SbtPlugin.addProjectNatures(project);
monitor.worked(1);
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
SbtProjectConfiguration config = new SbtProjectConfiguration(project, getSbtVersion(project));
config.saveConfiguration();
// add build.sbt
if (configuration.isForceDefaultSbtFile()) {
IFile sbtFile = project.getFile("build.sbt");
if (!sbtFile.exists()) {
sbtFile.create(IOUtils.toInputStream(TemplateBuilder.createSbtTemplate().build()), true, null);
} else {
sbtFile.setContents(IOUtils.toInputStream(TemplateBuilder.createSbtTemplate().build()), true, false, null);
}
}
IFolder folder = project.getFolder("project");
if (!folder.exists()) {
folder.create(true, true, null);
}
IFile file = project.getFile("project/plugins.sbt");
if (file.exists()) {
String source = IOUtils.toString(file.getContents(), "UTF-8");
file.setContents(
IOUtils.toInputStream(TemplateBuilder.createSbtPluginsTemplate().webNature(configuration.isWebNature())
.fill(source)), true, false, null);
} else {
file.create(
IOUtils.toInputStream(TemplateBuilder.createSbtPluginsTemplate().webNature(configuration.isWebNature()).build()),
true, null);
}
monitor.worked(1);
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
// run sbteclipse to generate Eclipse configuration files
monitor.setTaskName("Updating project configuration files...");
ILaunch launch = new UpdateProjectConfigurationAction().runFor(project);
while (!launch.getProcesses()[0].isTerminated()) {
Thread.sleep(500);
}
monitor.setTaskName("Refreshing the project...");
project.refreshLocal(IResource.DEPTH_INFINITE, null);
monitor.worked(1);
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
// refresh
monitor.setTaskName("Update project nature...");
SbtPlugin.addProjectNatures(project);
monitor.worked(1);
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
monitor.setTaskName("Refreshing the project...");
project.refreshLocal(IResource.DEPTH_INFINITE, null);
monitor.worked(1);
monitor.done();
} catch (Exception ex) {
throw new RuntimeException(ex);
}
return Status.OK_STATUS;
}
private static SbtVersion getSbtVersion(IProject project) {
// Check build.properties
Properties props = getBuildProperties(project);
if (props != null) {
String propertyVersion = props.getProperty("sbt.version");
SbtVersion version = SbtVersion.getVersion(propertyVersion);
if (version != null) {
return version;
}
}
return SbtVersion.getDefault();
}
private static Properties getBuildProperties(IProject project) {
try {
IFile file = project.getFile("project/build.properties");
if (file.exists()) {
InputStream in = file.getContents();
try {
Properties props = new Properties();
props.load(in);
return props;
} finally {
IOUtils.closeQuietly(in);
}
}
} catch (Exception e) {
}
return null;
}
}