package de.ovgu.cide.features.source;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
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.core.runtime.SubProgressMonitor;
import de.ovgu.cide.features.FeatureModelManager;
import de.ovgu.cide.features.IFeatureModel;
public abstract class ColoredSourceFileIteratorJob extends WorkspaceJob {
protected final IProject[] projects;
private String jobPrefix;
private String jobDescription;
protected boolean colorCacheUpdate = true;
public ColoredSourceFileIteratorJob(IProject[] projects,
String jobDescription, String jobPrefix) {
super(jobDescription);
this.jobDescription = jobDescription;
this.jobPrefix = jobPrefix;
this.projects = projects;
}
public ColoredSourceFileIteratorJob(IProject project,
String jobDescription, String jobPrefix) {
this(new IProject[] { project }, jobDescription, jobPrefix);
}
@Override
public IStatus runInWorkspace(IProgressMonitor monitor)
throws CoreException {
List<IProject> projects = new ArrayList<IProject>();
for (IProject project : this.projects) {
if (project.exists() && project.isOpen())
projects.add(project);
}
monitor.beginTask(jobDescription, projects.size());
for (IProject project : projects) {
IFeatureModel featureModel = FeatureModelManager.getInstance().getFeatureModelCore(project);
processProject(project, featureModel,new SubProgressMonitor(monitor, 1));
}
finish();
monitor.done();
if (monitor.isCanceled())
return Status.CANCEL_STATUS;
return Status.OK_STATUS;
}
protected void finish() {
}
private void processProject(IProject project, IFeatureModel featureModel,
IProgressMonitor monitor) throws CoreException {
if (monitor.isCanceled())
return;
monitor.beginTask(jobPrefix + " " + project.getProject().getName(),
countColoredFiles(project));
monitor.subTask(jobPrefix + " " + project.getProject().getName());
cleanProject(project, monitor);
processContainer(project, featureModel, monitor);
monitor.done();
}
private void processContainer(IContainer container,
IFeatureModel featureModel, IProgressMonitor monitor)
throws CoreException {
if (monitor.isCanceled())
return;
for (IResource resource : container.members()) {
if (resource instanceof IContainer)
processContainer((IContainer) resource, featureModel, monitor);
if (resource instanceof IFile)
processSourceFile((IFile) resource, featureModel, monitor);
}
}
private void processSourceFile(IFile file, IFeatureModel featureModel,
IProgressMonitor monitor) throws CoreException {
if (monitor.isCanceled())
return;
if ("color".equals(file.getFileExtension()))
return;
ColoredSourceFile source = ColoredSourceFile.getColoredSourceFile(file,
featureModel);
if (!source.isColored())
return;
monitor.subTask(jobPrefix + " " + file.getName());
// ISourceFile ast = source.getAST();
// ColoredIDEPlugin.getDefault().colorCache.updateASTColors(project,
// ast,
// source.getColorManager());
processSource(source);
monitor.worked(1);
}
protected abstract void processSource(ColoredSourceFile source)
throws CoreException;
protected void cleanProject(IProject project, IProgressMonitor monitor)
throws CoreException {
}
private int countColoredFiles(IContainer container) throws CoreException {
int result = 0;
for (IResource resource : container.members()) {
if (resource instanceof IContainer)
countColoredFiles((IContainer) resource);
if (resource instanceof IFile) {
IFile file = (IFile) resource;
if ("color".equals(file.getFileExtension()))
continue;
if (ColoredSourceFile.isFileColored(file))
result++;
}
}
return result;
}
}