package org.erlide.cover.ui.actions; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.ObjectInputStream; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.erlide.cover.core.Logger; import org.erlide.cover.core.MD5Checksum; import org.erlide.cover.ui.Activator; import org.erlide.cover.ui.CoverageHelper; import org.erlide.cover.ui.Images; import org.erlide.cover.ui.annotations.EditorTracker; import org.erlide.cover.views.model.ICoverageObject; import org.erlide.cover.views.model.ModuleSet; import org.erlide.cover.views.model.ModuleStats; import org.erlide.cover.views.model.ObjectType; import org.erlide.cover.views.model.StatsTreeModel; import org.erlide.engine.ErlangEngine; import org.erlide.util.ErlLogger; /** * An action for restoring coverage results which were previously saved * * @author Aleksandra Lipiec <aleksandra.lipiec@erlang-solutions com> * */ public class RestoreAction extends Action { private final Shell shell; private final TreeViewer viewer; private final Logger log; // logger public RestoreAction(final TreeViewer viewer) { shell = viewer.getControl().getShell(); this.viewer = viewer; log = Activator.getDefault(); } @Override public void run() { final IPath location = Activator.getDefault().getStateLocation() .append(SaveAction.DIR_NAME); final File dir = location.toFile(); if (!dir.exists() && !dir.mkdir()) { CoverageHelper.reportError("Can not save results!"); return; } // open dialog final ElementListSelectionDialog resDialog = new ElementListSelectionDialog(shell, labelProvider); resDialog.setElements(dir.listFiles()); resDialog.setTitle("Restoring results"); resDialog.setMessage("Select results to restore"); resDialog.open(); if (resDialog.getReturnCode() != Window.OK) { return; } // final File f = (File) resDialog.getFirstResult(); try (final ObjectInputStream objStream = new ObjectInputStream( new FileInputStream(f))) { final Object obj = objStream.readObject(); StatsTreeModel.changeInstance((StatsTreeModel) obj); StatsTreeModel.getInstance().setChanged(true); viewer.setInput(StatsTreeModel.getInstance()); final ICoverageObject root = StatsTreeModel.getInstance().getRoot(); final ModuleSet mSet = new ModuleSet(); createModuleSet(mSet, root); final Collection<ICoverageObject> col = root.getModules(); for (final ICoverageObject module : col) { if (ifMarkAnnotations((ModuleStats) module)) { ((ModuleStats) module).couldBeMarked = true; } else { ((ModuleStats) module).couldBeMarked = false; } } EditorTracker.getInstance().addAnnotations(); } catch (final FileNotFoundException e) { log.error("No such file"); ErlLogger.error(e); CoverageHelper.reportError("Error while reading file"); } catch (final Exception e) { log.error("Error while reading file"); ErlLogger.error(e); CoverageHelper.reportError("Error while reading file"); } } // creates module set used to prepare annotations map private void createModuleSet(final ModuleSet mSet, final ICoverageObject object) { if (object.getType().equals(ObjectType.MODULE)) { ModuleSet.add((ModuleStats) object); } final ICoverageObject[] children = object.getChildren(); for (final ICoverageObject child : children) { createModuleSet(mSet, child); } } // calculate md5 private boolean ifMarkAnnotations(final ModuleStats module) { try { final File file = new File(ErlangEngine.getInstance().getModel() .findModule(module.getLabel()).getFilePath()); if (module.getMd5().equals(MD5Checksum.getMD5(file))) { return true; } } catch (final Exception e) { ErlLogger.error(e); } return false; } // label provider for choosing files private final ILabelProvider labelProvider = new LabelProvider() { @Override public Image getImage(final Object element) { final Image img = Activator.getImageDescriptor(Images.RAW_FILE).createImage(); return img; } @Override public String getText(final Object element) { if (!(element instanceof File)) { return null; } final File f = (File) element; final SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); final Date d = new Date(); d.setTime(f.lastModified()); log.info(df.format(d)); final StringBuffer buf = new StringBuffer(); buf.append(f.getName()).append(" (").append(df.format(d)).append(")"); return buf.toString(); } }; }