com.jstar.eclipse.dialogs.InputFileDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.jstar.eclipse.dialogs.InputFileDialog.java

Source

/*
 * This file is part of jStar Eclipse Plug-in.
 * 
 * jStar Eclipse Plug-in is distributed under a BSD license,  see, LICENSE
 */
package com.jstar.eclipse.dialogs;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

import com.jstar.eclipse.Activator;
import com.jstar.eclipse.exceptions.InputFileNotFoundException;
import com.jstar.eclipse.objects.InputFileKind;
import com.jstar.eclipse.objects.JavaFile;
import com.jstar.eclipse.services.ConsoleService;
import com.jstar.eclipse.services.JStar.DebugMode;
import com.jstar.eclipse.services.Utils;
import com.jstar.eclipse.services.JStar.PrintMode;

public class InputFileDialog extends Dialog {
    private static final String PARSING = "Parsing";
    private static final String SYMBOLIC = "Symbolic execution";
    private static final String CORE = "Core flowgraph";
    private static final String SMT = "Smt solver";

    private JavaFile selectedFile;

    private Text specField;
    private Text logicField;
    private Text absField;
    private String specFieldValue;
    private String logicFieldValue;
    private String absFieldValue;
    private String jimpleFile;
    private PrintMode printMode;
    private String debugMode;
    private Button quiet;
    private Button verbose;
    private Button parsing;
    private Button symbolic;
    private Button core;
    private Button smt;

    private Button specSource;
    private Button specSeparate;
    private Label specLabel;
    private Button specButton;
    private boolean separateSpec;
    private Text genSpecField;
    private Label genSpecLabel;

    private String OPEN_TEXT = "Open";
    private String ADD_TEXT = "New";

    private Button logicButton;

    private Button absButton;

    private Button specImportButton;

    public InputFileDialog(Shell parentShell, JavaFile selectedFile) {
        super(parentShell);
        this.selectedFile = selectedFile;
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite parentComponent = (Composite) super.createDialogArea(parent);
        Composite component = new Composite(parentComponent, SWT.NONE);
        component.setLayout(new GridLayout());

        addSpecificationGroup(component);
        addInputFilesGroup(component);
        addModeGroup(component);
        addDebugModes(component);

        setDefaultLocations();

        return parentComponent;
    }

    private void addDebugModes(Composite component) {
        Group group = new Group(component, SWT.SHADOW_IN);
        group.setText("Debug modes");
        GridLayout gridLayout = new GridLayout();
        gridLayout.horizontalSpacing = 10;
        gridLayout.verticalSpacing = 10;
        group.setLayout(gridLayout);
        group.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        parsing = new Button(group, SWT.CHECK);
        parsing.setText(PARSING);
        parsing.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        symbolic = new Button(group, SWT.CHECK);
        symbolic.setText(SYMBOLIC);
        symbolic.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        core = new Button(group, SWT.CHECK);
        core.setText(CORE);
        core.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        smt = new Button(group, SWT.CHECK);
        smt.setText(SMT);
        smt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        setDebugModes(selectedFile.getDebugModes());
    }

    private void addModeGroup(Composite component) {
        Group group = new Group(component, SWT.SHADOW_IN);
        group.setText("Mode");
        GridLayout gridLayout = new GridLayout();
        gridLayout.horizontalSpacing = 10;
        gridLayout.verticalSpacing = 10;
        group.setLayout(gridLayout);
        group.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        quiet = new Button(group, SWT.RADIO);
        quiet.setText("Run jStar in quiet mode");
        quiet.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        verbose = new Button(group, SWT.RADIO);
        verbose.setText("Run jStar in verbose mode");
        verbose.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        setMode(selectedFile.getMode());
    }

    // TODO: refactor
    private void addSpecificationGroup(Composite component) {
        Group group = new Group(component, SWT.SHADOW_IN);
        group.setText("Specification");
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 4;
        gridLayout.horizontalSpacing = 10;
        gridLayout.verticalSpacing = 10;
        group.setLayout(gridLayout);

        specSource = new Button(group, SWT.RADIO);
        specSource.setText("Specification is included in the source file");
        specSource.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false, 4, 1));

        specSource.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                setEnabledSpecSeparate(false);
                setEnabledSpecInSource(true);
            }

            public void widgetDefaultSelected(SelectionEvent e) {
                setEnabledSpecSeparate(false);
                setEnabledSpecInSource(true);
            }
        });

        GridData gd = new GridData();
        gd.widthHint = 400;
        gd.horizontalSpan = 2;

        genSpecLabel = new Label(group, SWT.NONE);
        genSpecLabel.setText("Generated Specification File:");

        genSpecField = new Text(group, SWT.BORDER);
        genSpecField.setEditable(false);
        genSpecField.setLayoutData(gd);
        genSpecField.setText(selectedFile.getGeneratedSpec().getProjectRelativePath().toOSString());

        specSeparate = new Button(group, SWT.RADIO);
        specSeparate.setText("Specification is in separate file");
        specSeparate.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false, 4, 1));

        specSeparate.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                setEnabledSpecSeparate(true);
                setEnabledSpecInSource(false);
            }

            public void widgetDefaultSelected(SelectionEvent e) {
                setEnabledSpecSeparate(true);
                setEnabledSpecInSource(false);
            }
        });

        GridData gridData = new GridData();
        gridData.widthHint = 400;

        specLabel = new Label(group, SWT.NONE);
        specLabel.setText("Specification File:");

        specField = new Text(group, SWT.BORDER);
        specField.setEditable(false);
        specField.setLayoutData(gridData);

        boolean specExists = true;

        try {
            selectedFile.getSpecFile();
        } catch (InputFileNotFoundException ifnfe) {
            specExists = false;
        }

        specButton = new Button(group, SWT.PUSH);
        specButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                if (specButton.getText().equals(OPEN_TEXT)) {
                    Utils.getInstance().openFileInEditor(selectedFile.getSpecFile(), true);
                    setReturnCode(IDialogConstants.CANCEL_ID);
                    close();
                } else {
                    final IFile inputFile = Utils.getInstance().createEmptyFile(selectedFile, InputFileKind.SPEC);
                    specField.setText(inputFile.getProjectRelativePath().toOSString());
                    specButton.setText(OPEN_TEXT);
                    specButton.pack();
                }
            }
        });

        specImportButton = new Button(group, SWT.PUSH);
        specImportButton.setText("Import...");
        specImportButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                final IFile inputFile = importInputFile(InputFileKind.SPEC);

                if (inputFile != null) {
                    specField.setText(inputFile.getProjectRelativePath().toOSString());
                }
            }
        });

        if (specExists) {
            specButton.setText(OPEN_TEXT);
        } else {
            specButton.setText(ADD_TEXT);
        }

        if (selectedFile.isSpecInSource()) {
            specSource.setSelection(true);
            setEnabledSpecSeparate(false);
            setEnabledSpecInSource(true);
        } else {
            specSeparate.setSelection(true);
            setEnabledSpecSeparate(true);
            setEnabledSpecInSource(false);
        }
    }

    private IFile importInputFile(final InputFileKind inputFileKind) {
        final String filePath = loadFile();

        if (StringUtils.isNotBlank(filePath)) {
            final File file = new File(filePath);

            if (file.exists()) {
                try {
                    return Utils.getInstance().createFile(selectedFile, inputFileKind, new FileInputStream(file),
                            true);
                } catch (FileNotFoundException fnfe) {
                    fnfe.printStackTrace(ConsoleService.getInstance().getConsoleStream());
                }
            }
        }

        return null;
    }

    private void setEnabledSpecSeparate(boolean enabled) {
        specField.setEnabled(enabled);
        specLabel.setEnabled(enabled);
        specButton.setEnabled(enabled);
        specImportButton.setEnabled(enabled);
    }

    private void setEnabledSpecInSource(boolean enabled) {
        genSpecField.setEnabled(enabled);
        genSpecLabel.setEnabled(enabled);
    }

    // TODO: refactor
    private void addInputFilesGroup(Composite component) {
        Group group = new Group(component, SWT.SHADOW_IN);
        group.setText("Input Files");
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 4;
        gridLayout.horizontalSpacing = 10;
        gridLayout.verticalSpacing = 10;
        group.setLayout(gridLayout);
        group.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        Label logicLabel = new Label(group, SWT.NONE);
        logicLabel.setText("Logic rules:");

        logicField = new Text(group, SWT.BORDER);
        logicField.setEditable(false);
        logicField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        logicButton = new Button(group, SWT.PUSH);
        boolean logicExists = true;

        try {
            selectedFile.getLogicFile();
        } catch (InputFileNotFoundException ifnfe) {
            logicExists = false;
        }

        logicButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                if (logicButton.getText().equals(OPEN_TEXT)) {
                    Utils.getInstance().openFileInEditor(selectedFile.getLogicFile(), true);
                    setReturnCode(IDialogConstants.CANCEL_ID);
                    close();
                } else {
                    final IFile inputFile = Utils.getInstance().createEmptyFile(selectedFile, InputFileKind.LOGIC);
                    logicField.setText(inputFile.getProjectRelativePath().toOSString());
                    logicButton.setText(OPEN_TEXT);
                    logicButton.pack();
                }
            }
        });

        final Button logicImportButton = new Button(group, SWT.PUSH);
        logicImportButton.setText("Import...");
        logicImportButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                final IFile inputFile = importInputFile(InputFileKind.LOGIC);

                if (inputFile != null) {
                    logicField.setText(inputFile.getProjectRelativePath().toOSString());
                }
            }
        });

        if (logicExists) {
            logicButton.setText(OPEN_TEXT);
        } else {
            logicButton.setText(ADD_TEXT);
        }

        Label absLabel = new Label(group, SWT.NONE);
        absLabel.setText("Abstraction rules:");

        absField = new Text(group, SWT.BORDER);
        absField.setEditable(false);
        absField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        boolean absExists = true;

        try {
            selectedFile.getAbsFile();
        } catch (InputFileNotFoundException ifnfe) {
            absExists = false;
        }

        absButton = new Button(group, SWT.PUSH);
        absButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                if (absButton.getText().equals(OPEN_TEXT)) {
                    Utils.getInstance().openFileInEditor(selectedFile.getAbsFile(), true);
                    setReturnCode(IDialogConstants.CANCEL_ID);
                    close();
                } else {
                    final IFile inputFile = Utils.getInstance().createEmptyFile(selectedFile, InputFileKind.ABS);
                    absField.setText(inputFile.getProjectRelativePath().toOSString());
                    absButton.setText(OPEN_TEXT);
                    absButton.pack();
                }

            }
        });

        final Button absImportButton = new Button(group, SWT.PUSH);
        absImportButton.setText("Import...");
        absImportButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                final IFile inputFile = importInputFile(InputFileKind.ABS);

                if (inputFile != null) {
                    absField.setText(inputFile.getProjectRelativePath().toOSString());
                }
            }
        });

        if (absExists) {
            absButton.setText(OPEN_TEXT);
        } else {
            absButton.setText(ADD_TEXT);
        }
    }

    private void setDefaultLocations() {
        specField.setText(getInputFileLocation(InputFileKind.SPEC));
        logicField.setText(getInputFileLocation(InputFileKind.LOGIC));
        absField.setText(getInputFileLocation(InputFileKind.ABS));
    }

    private String getInputFileLocation(final InputFileKind inputFile) {
        try {
            return selectedFile.getInputFile(inputFile).getProjectRelativePath().toOSString();
        } catch (InputFileNotFoundException ifnfe) {
            return "";
        }
    }

    private PrintMode getMode() {
        if (verbose.getSelection()) {
            return PrintMode.VERBOSE;
        }

        return PrintMode.QUIET;
    }

    private void setMode(PrintMode mode) {
        if (mode.equals(PrintMode.QUIET)) {
            quiet.setSelection(true);
        } else {
            verbose.setSelection(true);
        }
    }

    private Set<DebugMode> getDebugModes() {
        final Set<DebugMode> debugModes = new HashSet<DebugMode>();

        if (parsing.getSelection()) {
            debugModes.add(DebugMode.PARSING);
        }

        if (symbolic.getSelection()) {
            debugModes.add(DebugMode.SYMBOLIC);
        }

        if (core.getSelection()) {
            debugModes.add(DebugMode.CORE);
        }

        if (smt.getSelection()) {
            debugModes.add(DebugMode.SMT);
        }

        return debugModes;
    }

    private void setDebugModes(Set<DebugMode> modes) {
        for (final DebugMode mode : modes) {
            checkDebugMode(mode);
        }
    }

    private void checkDebugMode(DebugMode mode) {
        switch (mode) {
        case PARSING:
            parsing.setSelection(true);
            break;
        case SYMBOLIC:
            symbolic.setSelection(true);
            break;
        case CORE:
            core.setSelection(true);
            break;
        case SMT:
            smt.setSelection(true);
            break;
        default:
            break;
        }
    }

    private String loadFile() {
        final FileDialog fd = new FileDialog(getShell(), SWT.OPEN);
        fd.setText("Open");
        return fd.open();
    }

    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText("jStar verification");
        shell.setImage(Activator.image);
    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        GridData gridData = new GridData();
        gridData.verticalAlignment = GridData.FILL;
        gridData.horizontalSpan = 3;
        gridData.grabExcessHorizontalSpace = true;
        gridData.grabExcessVerticalSpace = true;
        gridData.horizontalAlignment = SWT.RIGHT;

        parent.setLayoutData(gridData);

        Button button = createButton(parent, IDialogConstants.OK_ID, "Verify", true);
        button.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                setReturnCode(IDialogConstants.OK_ID);
                close();
            }
        });
        Button button1 = createButton(parent, IDialogConstants.CANCEL_ID, "Cancel", false);
        button1.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                setReturnCode(IDialogConstants.CANCEL_ID);
                close();
            }
        });
    }

    @Override
    protected void okPressed() {
        final PrintMode mode = getMode();
        setPrintMode(mode);
        selectedFile.setMode(mode);
        final Set<DebugMode> debugModes = getDebugModes();
        saveDebugMode(debugModes);
        selectedFile.setDebugModes(debugModes);

        if (specSource.getSelection()) {
            separateSpec = false;
        } else {
            separateSpec = true;
        }

        selectedFile.setSpecInSource(!separateSpec);

        super.okPressed();
    }

    public Text getSpecField() {
        return specField;
    }

    public Text getLogicField() {
        return logicField;
    }

    public Text getAbsField() {
        return absField;
    }

    public void setSpecFieldValue(String specFieldValue) {
        this.specFieldValue = specFieldValue;
    }

    public String getSpecFieldValue() {
        return specFieldValue;
    }

    public void setLogicFieldValue(String logicFieldValue) {
        this.logicFieldValue = logicFieldValue;
    }

    public String getLogicFieldValue() {
        return logicFieldValue;
    }

    public void setAbsFieldValue(String absFieldValue) {
        this.absFieldValue = absFieldValue;
    }

    public String getAbsFieldValue() {
        return absFieldValue;
    }

    public void setPrintMode(PrintMode printMode) {
        this.printMode = printMode;
    }

    public PrintMode getPrintMode() {
        return printMode;
    }

    public void saveDebugMode(Set<DebugMode> debugModes) {
        StringBuilder debugMode = new StringBuilder();

        for (final DebugMode mode : debugModes) {
            debugMode.append(mode.getCmdOption());
        }

        this.debugMode = debugMode.toString();
    }

    public String retrieveDebugMode() {
        return debugMode;
    }

    public String getJimpleFile() {
        return jimpleFile;
    }

    public void setJimpleFile(String jimpleFile) {
        this.jimpleFile = jimpleFile;
    }

    public boolean isSeparateSpec() {
        return separateSpec;
    }
}