package org.objectstyle.wolips.mechanic;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import com.google.eclipse.mechanic.CompositeTask;
public class ImportProjectsTask extends CompositeTask {
private static final Logger log = Logger.getLogger(ImportProjectsTask.class.getName());
private String _id;
private String _title;
private String _description;
private List<IPath> _importPaths;
private boolean _reconcileProjects;
private List<IProjectDescription> _projectDescriptions;
public ImportProjectsTask(String id, String title, String description, List<IPath> importPaths, boolean reconcileProjects) {
_id = id.replace(':', '_');
_title = title;
_description = description;
_importPaths = importPaths;
_reconcileProjects = reconcileProjects;
}
@Override
public String getId() {
return "ImportProjectsTask-" + _id;
}
public String getDescription() {
return _description;
}
public String getTitle() {
return _title;
}
protected List<IPath> findProjectFolderPaths() {
List<IPath> projectFolderPaths = new LinkedList<IPath>();
for (IPath importPath : _importPaths) {
File importFolder;
if (importPath.isAbsolute()) {
importFolder = importPath.toFile();
}
else {
importFolder = ResourcesPlugin.getWorkspace().getRoot().getRawLocation().append(importPath).toFile();
}
// Support the root path being a project
File importProjectFilePath = new File(importFolder, ".project");
if (importProjectFilePath.exists()) {
projectFolderPaths.add(new Path(importProjectFilePath.getAbsolutePath()));
}
// ... but also check the child folders
File[] possibleProjectFolders = importFolder.listFiles();
if (possibleProjectFolders != null) {
for (File possibleProjectFolder : possibleProjectFolders) {
if (possibleProjectFolder.isDirectory()) {
File projectFilePath = new File(possibleProjectFolder, ".project");
if (projectFilePath.exists()) {
projectFolderPaths.add(new Path(projectFilePath.getAbsolutePath()));
}
}
}
}
}
return projectFolderPaths;
}
public synchronized boolean evaluate() {
_projectDescriptions = null;
boolean allProjectsExist = !_reconcileProjects && Activator.getDefault().getPreferenceStore().getBoolean(getId());
if (!allProjectsExist) {
allProjectsExist = true;
_projectDescriptions = new LinkedList<IProjectDescription>();
IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
for (IPath projectFolderPath : findProjectFolderPaths()) {
try {
IProjectDescription projectDescription = ResourcesPlugin.getWorkspace().loadProjectDescription(projectFolderPath);
if (!workspaceRoot.getProject(projectDescription.getName()).exists()) {
_projectDescriptions.add(projectDescription);
allProjectsExist = false;
}
}
catch (Throwable e) {
log.log(Level.SEVERE, "Failed to import " + projectFolderPath + ".", e);
}
}
}
return allProjectsExist;
}
public synchronized void run() {
final List<IProjectDescription> projectDescriptions = _projectDescriptions;
if (projectDescriptions == null) {
return;
}
new WorkspaceJob("Importing") {
@Override
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
try {
for (IProjectDescription projectDescription : projectDescriptions) {
try {
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectDescription.getName());
monitor.beginTask("Importing " + project.getName() + " ...", 100);
project.create(projectDescription, new SubProgressMonitor(monitor, 30));
project.open(IResource.BACKGROUND_REFRESH, new SubProgressMonitor(monitor, 70));
}
catch (Throwable t) {
System.out.println("ImportProjectsTask.run: " + t.getMessage());
}
}
if (_reconcileProjects) {
Activator.getDefault().getPreferenceStore().setValue(getId(), true);
}
}
finally {
monitor.done();
}
return Status.OK_STATUS;
}
}.schedule();
}
}