/**
* Copyright (c) 2011 Cloudsmith Inc. and other contributors, as listed below.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Cloudsmith
*
*/
package org.cloudsmith.geppetto.ui.wizard;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.cloudsmith.geppetto.forge.Forge;
import org.cloudsmith.geppetto.ui.UIPlugin;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.dialogs.IOverwriteQuery;
import org.eclipse.ui.internal.wizards.datatransfer.DataTransferMessages;
public abstract class ModuleExportOperation implements IRunnableWithProgress {
static class ExportSpec {
private final File moduleDirectory;
private final FileFilter fileFilter;
ExportSpec(File moduleRoot, FileFilter fileFilter) {
this.moduleDirectory = moduleRoot;
this.fileFilter = fileFilter;
}
FileFilter getFileFilter() {
return fileFilter;
}
File getModuleRoot() {
return moduleDirectory;
}
}
public static class ResourceFileFilter implements FileFilter {
private final FileFilter defaultFilter;
private final List<File> acceptedFiles;
public ResourceFileFilter(Collection<IResource> resources, FileFilter defaultFilter) {
this.defaultFilter = defaultFilter;
acceptedFiles = new ArrayList<File>(resources.size());
for(IResource resource : resources)
acceptedFiles.add(resource.getLocation().toFile());
}
@Override
public boolean accept(File file) {
return defaultFilter.accept(file) && acceptedFiles.contains(file);
}
}
private final List<ExportSpec> exportSpecs;
private final File destination;
private final List<IStatus> errorTable = new ArrayList<IStatus>();
public ModuleExportOperation(List<ExportSpec> exportSpecs, File destination, IOverwriteQuery overwriteImplementor) {
this.exportSpecs = exportSpecs;
this.destination = destination;
}
protected File getDestination() {
return destination;
}
protected abstract Forge getForge();
public IStatus getStatus() {
if(errorTable.isEmpty())
return Status.OK_STATUS;
if(errorTable.size() == 1)
return errorTable.get(0);
return new MultiStatus(
errorTable.get(0).getPlugin(), 0, errorTable.toArray(new IStatus[errorTable.size()]),
DataTransferMessages.FileSystemExportOperation_problemsExporting, null);
}
public void run(IProgressMonitor monitor) throws InterruptedException {
monitor.beginTask(null, 100);
try {
List<String> subtaskNames = new ArrayList<String>(exportSpecs.size());
for(ExportSpec spec : exportSpecs)
subtaskNames.add("Building module " + spec.getModuleRoot().getPath());
DiagnosticWithProgress diagWithProgress = new DiagnosticWithProgress(monitor, 100, subtaskNames, 200);
for(ExportSpec spec : exportSpecs) {
if(monitor.isCanceled())
throw new OperationCanceledException();
try {
getForge().build(spec.getModuleRoot(), destination, spec.getFileFilter(), null, diagWithProgress);
diagWithProgress.taskDone();
}
catch(IOException e) {
errorTable.add(UIPlugin.createStatus(IStatus.ERROR, NLS.bind(
DataTransferMessages.DataTransfer_errorExporting, spec.getModuleRoot().getAbsoluteFile(),
e.getMessage()), e));
}
}
diagWithProgress.done();
}
finally {
monitor.done();
}
}
}