Package org.erlide.cover.ui.actions

Source Code of org.erlide.cover.ui.actions.RestoreAction

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;
            try {
                obj = objStream.readObject();
            } finally {
                objStream.close();
            }

            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();
        }

    };

}
TOP

Related Classes of org.erlide.cover.ui.actions.RestoreAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.