package org.org.eclipse.cheatsheet.commands.internal.jobs; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URISyntaxException; import java.net.URL; import java.util.Collections; import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.jobs.Job; import org.org.eclipse.core.utils.platform.filegen.FreemarkerFileGenerator; import org.org.eclipse.core.utils.platform.filegen.FreemarkerFileGeneratorInput; import org.org.eclipse.core.utils.platform.filegen.IFileGenerator; import org.org.eclipse.core.utils.platform.filegen.TemplateEngine; import org.org.eclipse.core.utils.platform.filegen.VelocityFileGenerator; import org.org.eclipse.core.utils.platform.filegen.VelocityFileGeneratorInput; import org.org.eclipse.core.utils.platform.jobs.BatchSimilarRule; import org.org.eclipse.core.utils.platform.tools.IOToolBox; import org.org.eclipse.core.utils.platform.wizards.StatusInfo; public class GenerateFileInFileSystemJob extends Job { private static String JOB_ID = "CheatSheet helper: generate file in filesystem"; private final TemplateEngine templateEngine; private final URL templateUrl; private final Map<String, String> resolvedFields; private final String targetFile; public GenerateFileInFileSystemJob(TemplateEngine templateEngine, URL templateUrl, Map<String, String> resolvedFields, String targetFile) { super(JOB_ID); this.templateEngine = templateEngine; this.templateUrl = templateUrl; this.resolvedFields = Collections.unmodifiableMap(resolvedFields); this.targetFile = targetFile; this.setPriority(Job.SHORT); this.setUser(true); this.setRule(new BatchSimilarRule(CheatSheetJobs.JOB_FAMILY)); } @Override protected IStatus run(IProgressMonitor monitor) { IStatus result = new StatusInfo(IStatus.OK, "File created successfully."); try { generateFile(monitor); } catch (Throwable e) { monitor.setCanceled(true); result = new StatusInfo(IStatus.ERROR, "A problem occured while generating file:\n" + e.getMessage()); } monitor.done(); return result; } private void generateFile(IProgressMonitor monitor) throws IOException, URISyntaxException { InputStream templateInputStream = null; OutputStream fileOutputStream = null; try { templateInputStream = templateUrl.openConnection(IOToolBox.determineProxy(templateUrl)).getInputStream(); fileOutputStream = new FileOutputStream(targetFile); if (templateEngine == TemplateEngine.VELOCITY) { VelocityFileGeneratorInput generatorInput = new VelocityFileGeneratorInput(resolvedFields, templateInputStream); IFileGenerator<VelocityFileGeneratorInput> fileGenerator = new VelocityFileGenerator(); fileGenerator.generate(generatorInput, fileOutputStream); } else if (templateEngine == TemplateEngine.FREEMARKER) { FreemarkerFileGeneratorInput generatorInput = new FreemarkerFileGeneratorInput(resolvedFields, templateInputStream); IFileGenerator<FreemarkerFileGeneratorInput> fileGenerator = new FreemarkerFileGenerator(); fileGenerator.generate(generatorInput, "UTF-8"); } } finally { try { templateInputStream.close(); fileOutputStream.flush(); fileOutputStream.close(); } catch (Throwable e) { } } } }