/* * #%~ * org.overture.ide.plugins.latex * %% * Copyright (C) 2008 - 2014 Overture * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #~% */ package org.overture.ide.plugins.latex.utility; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.Assert; 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.jobs.Job; import org.eclipse.swt.widgets.Shell; import org.overture.ast.definitions.SClassDefinition; import org.overture.ast.lex.Dialect; import org.overture.ast.lex.LexLocation; import org.overture.ast.modules.AModuleModules; import org.overture.ast.util.definitions.ClassList; import org.overture.ast.util.modules.ModuleList; import org.overture.config.Settings; import org.overture.ide.core.IVdmModel; import org.overture.ide.core.resources.IVdmProject; import org.overture.ide.plugins.latex.LatexPlugin; import org.overture.ide.ui.VdmUIPlugin; import org.overture.ide.ui.utility.VdmTypeCheckerUi; import org.overture.interpreter.runtime.LatexSourceFile; public class LatexUtils extends LatexUtilsBase { private Shell shell; public LatexUtils(Shell shell) { this.shell = shell; } public void makeLatex(final IVdmProject selectedProject, final Dialect dialect) { final Job expandJob = new Job("Generating tex files.") { @Override protected IStatus run(IProgressMonitor monitor) { monitor.worked(IProgressMonitor.UNKNOWN); try { IProject project = (IProject) selectedProject.getAdapter(IProject.class); IVdmProject vdmProject = (IVdmProject) project.getAdapter(IVdmProject.class); Assert.isNotNull(project, "Project could not be adapted"); File projectRoot = project.getLocation().toFile(); File outputFolder = LatexBuilder.makeOutputFolder(project); PdfBuilder latexBuilder = null; if (LatexPlugin.usePdfLatex()) { latexBuilder = new LatexBuilder(); } else { latexBuilder = new XetexBuilder(); } latexBuilder.prepare(project, dialect); File outputFolderForGeneratedModelFiles = new File(outputFolder, "specification"); if (!outputFolderForGeneratedModelFiles.exists()) { outputFolderForGeneratedModelFiles.mkdirs(); } IVdmModel model = selectedProject.getModel(); if (model == null || !model.isTypeCorrect()) { shell.getDisplay().asyncExec(new Runnable() { public void run() { VdmTypeCheckerUi.typeCheck(shell, selectedProject); } }); } // if () { boolean modelOnly = modelOnly(vdmProject); boolean includeCoverageTable = insertCoverageTable(vdmProject); boolean markCoverage = markCoverage(vdmProject); LexLocation.resetLocations(); if (selectedProject.getDialect() == Dialect.VDM_PP || selectedProject.getDialect() == Dialect.VDM_RT) { ClassList classes = parseClasses(selectedProject); List<File> outputFiles = getFileChildern(vdmProject.getModelBuildPath().getOutput().getLocation().toFile()); for (SClassDefinition classDefinition : classes) { createCoverage(latexBuilder, outputFolderForGeneratedModelFiles, outputFiles, classDefinition.getLocation().getFile(), modelOnly,markCoverage,includeCoverageTable); } } else if (selectedProject.getDialect() == Dialect.VDM_SL) { List<File> outputFiles = getFileChildern(vdmProject.getModelBuildPath().getOutput().getLocation().toFile()); ModuleList modules = parseModules(selectedProject); for (AModuleModules classDefinition : modules) { for (File moduleFile : classDefinition.getFiles()) { createCoverage(latexBuilder, outputFolderForGeneratedModelFiles, outputFiles, moduleFile, modelOnly,markCoverage,includeCoverageTable); } } } } String documentFileName = selectedProject.getName() + ".tex"; latexBuilder.saveDocument(project, projectRoot, documentFileName); if (hasGenerateMainDocument(vdmProject)) { buildPdf(project, monitor, outputFolder, documentFileName); } else { documentFileName = getDocument(vdmProject); if (!new File(documentFileName).exists()) { return new Status(IStatus.ERROR, LatexPlugin.PLUGIN_ID, IStatus.OK, "Main document does not exist: " + documentFileName, null); } outputFolder = LatexBuilder.makeOutputFolder(project); buildPdf(project, monitor, outputFolder, documentFileName); } } catch (Exception e) { e.printStackTrace(); return new Status(IStatus.ERROR, LatexPlugin.PLUGIN_ID, "Unknown error", e); } monitor.done(); // expandCompleted = true; return new Status(IStatus.OK, LatexPlugin.PLUGIN_ID, IStatus.OK, "Translation completed", null); } private void buildPdf(final IProject selectedProject, IProgressMonitor monitor, File outputFolder, String documentFileName) throws InterruptedException, CoreException { PdfGenerator pdflatex = null; if (LatexPlugin.usePdfLatex()) { pdflatex = new PdfLatex(selectedProject, outputFolder, documentFileName); } else { pdflatex = new Xetex(selectedProject, outputFolder, documentFileName); } pdflatex.start(); while (!monitor.isCanceled() && !pdflatex.isFinished() && !pdflatex.hasFailed()) { Thread.sleep(500); } if (monitor.isCanceled() || pdflatex.hasFailed()) { pdflatex.kill(); if (pdflatex.hasFailed()) { VdmUIPlugin.logErrorMessage("PDF creation failed. Please inspect the pdf console for further information."); } } else { PdfGenerator pdflatex2 = null; if (LatexPlugin.usePdfLatex()) { pdflatex2 = new PdfLatex(selectedProject, outputFolder, documentFileName); } else { pdflatex2 = new Xetex(selectedProject, outputFolder, documentFileName); } pdflatex2.start(); while (!monitor.isCanceled() && !pdflatex2.isFinished() && !pdflatex.hasFailed()) { Thread.sleep(500); } if (monitor.isCanceled() || pdflatex.hasFailed()) { pdflatex2.kill(); if (pdflatex.hasFailed()) { VdmUIPlugin.logErrorMessage("PDF creation failed. Please inspect the pdf console for further information."); } } } selectedProject.refreshLocal(IResource.DEPTH_INFINITE, null); } private void createCoverage(PdfBuilder latexBuilder, File outputFolderForGeneratedModelFiles, List<File> outputFiles, File moduleFile, boolean modelOnly,boolean markCoverage, boolean includeCoverageTable) throws IOException, FileNotFoundException, CoreException { if (isStandardLibarary(moduleFile)) { return; } if (!outputFolderForGeneratedModelFiles.exists()) { outputFolderForGeneratedModelFiles.mkdirs(); } File texFile = new File(outputFolderForGeneratedModelFiles, moduleFile.getName().replace(" ", "") + ".tex"); if (texFile.exists()) { texFile.delete(); } if (markCoverage || includeCoverageTable) { for (int i = 0; i < outputFiles.size(); i++) { File file = outputFiles.get(i); // System.out.println("Compare with file: " // + file.getName()); if (file.getName().toLowerCase().endsWith(".covtbl") && moduleFile.getName().equals(getFileName(file))) { // System.out.println("Match"); LexLocation.mergeHits(moduleFile, file); outputFiles.remove(i); } } } IFile selectedModelFile = selectedProject.findIFile(moduleFile); String charset = selectedModelFile.getCharset(); latexBuilder.addInclude(texFile.getAbsolutePath()); // VDMJ.filecharset = "utf-8"; PrintWriter pw = new PrintWriter(texFile, charset); IProject project = (IProject) selectedProject.getAdapter(IProject.class); Assert.isNotNull(project, "Project could not be adapted"); IVdmProject vdmProject = (IVdmProject) project.getAdapter(IVdmProject.class); Settings.dialect = vdmProject.getDialect(); if (markCoverage(vdmProject)) { if (LatexPlugin.usePdfLatex()) { new LatexSourceFile(moduleFile, charset).printCoverage(pw, false, modelOnly, insertCoverageTable(vdmProject)); } else { new XetexSourceFile(moduleFile, charset).printCoverage(pw, false, modelOnly, insertCoverageTable(vdmProject)); } } else { if (LatexPlugin.usePdfLatex()) { new LatexSourceFile(moduleFile, charset).print(pw, false, modelOnly, insertCoverageTable(vdmProject), false); } else { new XetexSourceFile(moduleFile, charset).print(pw, false, modelOnly, insertCoverageTable(vdmProject), false); } } // ConsoleWriter cw = new ConsoleWriter("LATEX"); // f.printCoverage(cw); pw.close(); } private boolean isStandardLibarary(File moduleFile) { return moduleFile.getParentFile().getName().equalsIgnoreCase("lib"); } }; expandJob.setPriority(Job.BUILD); expandJob.schedule(0); } }