package org.erlide.cover.ui.actions; import java.io.File; import java.io.FileWriter; import java.io.IOException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.statushandlers.StatusManager; import org.erlide.cover.constants.CoverConstants; import org.erlide.cover.core.Logger; import org.erlide.cover.ui.Activator; import org.erlide.cover.ui.CoverageHelper; import org.erlide.cover.ui.views.util.BrowserDialog; import org.erlide.cover.ui.views.util.ReportGenerator; import org.erlide.cover.views.model.FunctionStats; import org.erlide.cover.views.model.ICoverageObject; import org.erlide.cover.views.model.ModuleStats; import org.erlide.cover.views.model.ObjectType; import org.erlide.cover.views.model.StatsTreeModel; import org.erlide.cover.views.model.StatsTreeObject; import org.erlide.util.ErlLogger; /** * Action for showing html reports * * @author Aleksandra Lipiec <aleksandra.lipiec@erlang-solutions.com> * */ public class HtmlReportAction extends Action { private final Shell shell; private final TreeViewer viewer; private final Logger log; // logger public HtmlReportAction(final TreeViewer viewer) { shell = viewer.getControl().getShell(); this.viewer = viewer; log = Activator.getDefault(); } @Override public void run() { log.info("html report!"); // viewer jest selection providerem if (StatsTreeModel.getInstance().getRoot().getHtmlPath() == null) { final IPath location = Activator.getDefault().getStateLocation() .append(CoverConstants.REPORT_DIR); final File dir = location.toFile(); if (!dir.exists() && !dir.mkdir()) { CoverageHelper.reportError("Can not save results!"); return; } generateReportTree(StatsTreeModel.getInstance().getRoot(), dir.getAbsolutePath()); } final ISelection selection = viewer.getSelection(); log.info(selection.getClass().getName()); if (!(selection instanceof ITreeSelection)) { final IStatus executionStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Internall error occured: bad sellection type", null); StatusManager.getManager().handle(executionStatus, StatusManager.SHOW); return; } final ITreeSelection treeSelection = (ITreeSelection) selection; log.info(treeSelection.getFirstElement()); log.info(treeSelection.getFirstElement().getClass().getName()); log.info(treeSelection.getPaths()); final StatsTreeObject selObj = (StatsTreeObject) treeSelection.getFirstElement(); final BrowserDialog browser = new BrowserDialog(shell); if (selObj instanceof FunctionStats) { final ModuleStats module = (ModuleStats) selObj.getParent(); browser.setObject(module); } else { browser.setObject(selObj); } browser.open(); } /** * Generates html reports * * @param obj * @param path */ private void generateReportTree(final ICoverageObject obj, final String path) { if (obj.getType().equals(ObjectType.MODULE)) { return; } final String reportPath = new StringBuilder(path).append(File.separator) .append(obj.getLabel()).append(".html").toString(); log.info(reportPath); final String dirPath = new StringBuilder(path).append(File.separator) .append(obj.getLabel()).toString(); final File dir = new File(dirPath); dir.mkdir(); for (final ICoverageObject child : obj.getChildren()) { generateReportTree(child, dirPath); } try { final String report = ReportGenerator.getInstance().getHTMLreport(obj, false); log.info(report); try (final FileWriter writer = new FileWriter(reportPath)) { writer.write(report); } obj.setHtmlPath(reportPath); } catch (final IOException e) { ErlLogger.error(e); } for (final ICoverageObject child : obj.getChildren()) { generateReportTree(child, dirPath); } } }