/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.project.build;
import java.util.Map;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IncrementalProjectBuilder;
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.core.runtime.jobs.Job;
import org.robotframework.ide.eclipse.main.plugin.RedPlugin;
import org.robotframework.ide.eclipse.main.plugin.model.LibspecsFolder;
import org.robotframework.ide.eclipse.main.plugin.model.RobotProject;
import org.robotframework.ide.eclipse.main.plugin.project.build.RobotArtifactsValidator.ModelUnitValidatorConfig;
import org.robotframework.ide.eclipse.main.plugin.project.build.RobotArtifactsValidator.ModelUnitValidatorConfigFactory;
public class RobotProjectBuilder extends IncrementalProjectBuilder {
private final BuildLogger logger;
private final ProblemsReportingStrategy reporter;
private final ProblemsReportingStrategy fatalReporter;
public RobotProjectBuilder() {
this(ProblemsReportingStrategy.reportOnly(), ProblemsReportingStrategy.reportAndPanic(), new BuildLogger());
}
public RobotProjectBuilder(final ProblemsReportingStrategy reporter, final ProblemsReportingStrategy fatalReporter,
final BuildLogger logger) {
this.reporter = reporter;
this.fatalReporter = fatalReporter;
this.logger = logger;
}
@Override
protected IProject[] build(final int kind, final Map<String, String> args, final IProgressMonitor monitor)
throws CoreException {
final RobotProject robotProject = RedPlugin.getModelManager().getModel().createRobotProject(getProject());
build(kind, robotProject, monitor);
return null;
}
public void build(final int kind, final RobotProject robotProject, final IProgressMonitor monitor)
throws CoreException {
try {
final IProject project = robotProject.getProject();
final LibspecsFolder libspecsFolder = LibspecsFolder.createIfNeeded(project);
final IResourceDelta delta = getDelta(project);
final boolean rebuildNeeded = libspecsFolder.shouldRegenerateLibspecs(delta, kind);
final Job buildJob = new RobotArtifactsBuilder(project, logger).createBuildJob(rebuildNeeded, fatalReporter,
reporter);
final ModelUnitValidatorConfig validatorConfig = ModelUnitValidatorConfigFactory.create(project, delta,
kind, reporter);
final Job validationJob = new RobotArtifactsValidator(project, logger).createValidationJob(buildJob,
validatorConfig);
try {
final String projectPath = project.getFullPath().toString();
monitor.subTask("waiting for project " + projectPath + " build end");
buildJob.schedule();
validationJob.schedule();
buildJob.join();
if (buildJob.getResult().getSeverity() == IStatus.CANCEL
|| buildJob.getResult().getSeverity() == IStatus.ERROR) {
robotProject.clearConfiguration();
if (libspecsFolder.exists()) {
libspecsFolder.remove();
validationJob.cancel();
return;
}
}
robotProject.clearConfiguration();
project.refreshLocal(IResource.DEPTH_INFINITE, null);
if (!monitor.isCanceled()) {
monitor.subTask("waiting for project " + projectPath + " validation end");
validationJob.join();
}
} catch (final InterruptedException e) {
throw new CoreException(Status.CANCEL_STATUS);
}
} finally {
monitor.worked(1);
}
}
@Override
protected void clean(final IProgressMonitor monitor) throws CoreException {
clean(RedPlugin.getModelManager().createProject(getProject()));
}
public static void clean(final RobotProject project) throws CoreException {
project.getProject().deleteMarkers(RobotProblem.TYPE_ID, true, IResource.DEPTH_INFINITE);
project.clearConfiguration();
project.clearKwSources();
LibspecsFolder.get(project.getProject()).removeNonSpecResources();
}
}