package de.sebastianbenz.task.ui.handlers;
import static com.google.common.collect.Iterables.filter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Iterator;
import org.eclipse.emf.common.util.WrappedException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.xtext.parser.IEncodingProvider;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.editor.XtextEditor;
import org.eclipse.xtext.util.Files;
import de.sebastianbenz.task.TaskModel;
import de.sebastianbenz.task.generator.TaskGenerator;
public abstract class AbstractExportHandler extends AbstractEditorHandler {
private final TaskGenerator generator;
private final IEncodingProvider encodingProvider;
public AbstractExportHandler(TaskGenerator generator, IEncodingProvider encodingProvider) {
super();
this.generator = generator;
this.encodingProvider = encodingProvider;
}
protected abstract String[] fileExtensions();
@Override
protected void doExecute(final XtextEditor xtextEditor,
XtextResource resource) {
String path = selectFile(xtextEditor.getSite().getShell(), resource);
if (path == null) {
return;
}
doExport(resource, path);
}
protected void doExport(XtextResource resource, String path) {
Iterable<TaskModel> taskModels = filter(resource.getContents(),
TaskModel.class);
Iterator<TaskModel> iterator = taskModels.iterator();
if (!iterator.hasNext()) {
return;
}
CharSequence string = generator.generate(iterator.next());
String encoding = encodingProvider.getEncoding(resource.getURI());
writeStringIntoFile(path, string.toString(), encoding);
}
public static void writeStringIntoFile(String filename, String content, String encoding) {
try {
final File file = new File(filename);
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file), encoding);
try {
writer.append(content);
} finally {
writer.close();
}
} catch (IOException e) {
throw new WrappedException(e);
}
}
protected String selectFile(Shell shell, XtextResource resource) {
FileDialog fileDialog = new FileDialog(shell, SWT.SAVE);
fileDialog.setFilterExtensions(fileExtensions());
fileDialog.setText("Select target file");
fileDialog.setFileName(resource.getURI().trimFileExtension()
.lastSegment() + "." + getFileExtension());
String result = fileDialog.open();
return result;
}
protected abstract String getFileExtension();
}