package org.bndtools.core.jobs;
import java.io.File;
import java.io.OutputStream;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
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.SubMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.osgi.service.indexer.ResourceIndexer;
import aQute.lib.io.IO;
import bndtools.Plugin;
public class GenerateIndexJob extends Job {
private final Set<File> files;
private final File outputFile;
private final Map<String,String> config;
public GenerateIndexJob(Set<File> files, File outputFile, Map<String,String> config) {
super("Generating index");
this.files = files;
this.outputFile = outputFile;
this.config = config;
}
@Override
protected IStatus run(IProgressMonitor monitor) {
SubMonitor progress = SubMonitor.convert(monitor);
// Generate index
try (OutputStream outputStream = IO.outputStream(outputFile)) {
ResourceIndexer indexer = Plugin.getDefault().getResourceIndexer();
indexer.index(files, outputStream, config);
} catch (Exception e) {
return new Status(IStatus.ERROR, Plugin.PLUGIN_ID, 0, "Error indexing files.", e);
}
// Make eclipse aware of the new/changed resource
final IWorkspace ws = ResourcesPlugin.getWorkspace();
final IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
@Override
public void run(IProgressMonitor monitor) throws CoreException {
IFile[] outputResources = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(outputFile.toURI());
if (outputResources != null) {
for (IFile resource : outputResources) {
resource.refreshLocal(IResource.DEPTH_ZERO, monitor);
}
}
}
};
try {
ws.run(runnable, progress.newChild(1, SubMonitor.SUPPRESS_NONE));
} catch (CoreException e) {
return new Status(IStatus.ERROR, Plugin.PLUGIN_ID, 0, "Error refreshing workspace files.", e);
}
return Status.OK_STATUS;
}
}