com.bb.extensions.plugin.unittests.internal.actions.TestFileOpenAction.java Source code

Java tutorial

Introduction

Here is the source code for com.bb.extensions.plugin.unittests.internal.actions.TestFileOpenAction.java

Source

/*******************************************************************************
 * Copyright (C) 2013 Research In Motion Limited
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/

package com.bb.extensions.plugin.unittests.internal.actions;

import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.BaseSelectionListenerAction;
import org.eclipse.ui.part.FileEditorInput;

import com.bb.extensions.plugin.unittests.internal.navigator.IHasParsedClassInformation;
import com.bb.extensions.plugin.unittests.internal.navigator.ParsedClassInformation;
import com.bb.extensions.plugin.unittests.internal.navigator.TestFileUnitTestsNavigatorElement;
import com.bb.extensions.plugin.unittests.internal.utilities.FileUtils;

/**
 * @author tallen
 * 
 */
public class TestFileOpenAction extends BaseSelectionListenerAction {

    /**
     * The default open action
     */
    private final BaseSelectionListenerAction _openAction;

    /**
     * The currently selected help item
     */
    private TestFileUnitTestsNavigatorElement _selectedElement;

    /**
     * The template for the test fixture to automatically insert into the test
     * files
     */
    private static final String _testFixtureTemplate = "\nclass {{class.name}}Test: public testing::Test {\n"
            + "\tvirtual void SetUp() {\n" + "\n" + "\t}\n" + "\tvirtual void TearDown() {\n" + "\t}\n" + "};\n";

    /**
     * The sample test template
     */
    private static final String _sampleTestTemplate = "\nTEST_F({{class.name}}Test, SampleTest) {\n" + "\n}\n";

    /**
     * @param commonOpen
     *            The default open action
     */
    public TestFileOpenAction(BaseSelectionListenerAction commonOpen) {
        super(commonOpen.getText());

        _openAction = commonOpen;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.action.Action#run()
     */
    @Override
    public void run() {
        if (_selectedElement != null) {
            IFile file = getTestFile();

            final IEditorInput editorInput = new FileEditorInput(file);
            IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
            final IWorkbenchPage page = window.getActivePage();
            final IEditorDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry()
                    .getDefaultEditor(file.getName());
            Display.getDefault().asyncExec(new Runnable() {
                /*
                 * (non-Javadoc)
                 * 
                 * @see java.lang.Runnable#run()
                 */
                @Override
                public void run() {
                    try {
                        page.openEditor(editorInput, desc.getId());
                    } catch (PartInitException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }

    /**
     * @return The IFile pointing to the test file
     */
    private IFile getTestFile() {
        IFile file = _selectedElement.getTestFile();
        if (!file.exists()) {
            try {
                FileUtils.create(file);
                this.addTestTemplate(file);
            } catch (CoreException e) {
                e.printStackTrace();
            }
        }
        return file;
    }

    /**
     * adds default includes to the test file
     * 
     * @param file
     */
    private void addTestTemplate(IFile file) {
        ByteArrayOutputStream bArrayOutStream = new ByteArrayOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(bArrayOutStream));
        try {
            writer.write("#include <gmock/gmock.h>\n");

            if (_selectedElement instanceof IHasParsedClassInformation) {
                ParsedClassInformation classInformation = ((IHasParsedClassInformation) _selectedElement)
                        .getClassInformation();
                IPath classNamespacePath = classInformation.getNamespacePath();

                String includeFile = "";
                if (!classNamespacePath.isEmpty()) {
                    includeFile = classNamespacePath.toString() + "/"; //$NON-NLS-1$
                }
                includeFile += classInformation.getFile().getName();
                writer.write("#include <" + includeFile + ">\n");

                writer.write(_testFixtureTemplate.replace("{{class.name}}", classInformation.getName()));

                writer.write(_sampleTestTemplate.replace("{{class.name}}", classInformation.getName()));
            }

            writer.flush();
            file.setContents(new ByteArrayInputStream(bArrayOutStream.toByteArray()), 0, null);
            writer.close();
            bArrayOutStream.close();

        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (CoreException e) {
            e.printStackTrace();
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org
     * .eclipse.jface.viewers.IStructuredSelection)
     */
    @Override
    protected boolean updateSelection(IStructuredSelection selection) {
        boolean result = false;

        _selectedElement = null;

        if (!selection.isEmpty()) {
            Object selected = selection.getFirstElement();
            if (selected instanceof TestFileUnitTestsNavigatorElement) {
                _selectedElement = (TestFileUnitTestsNavigatorElement) selected;
                result = true;
            }
        }

        _openAction.selectionChanged(selection);
        result = result || _openAction.isEnabled();

        return result;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.action.Action#getAccelerator()
     */
    @Override
    public int getAccelerator() {
        return _openAction.getAccelerator();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.action.Action#getDescription()
     */
    @Override
    public String getDescription() {
        return _openAction.getDescription();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.action.Action#getDisabledImageDescriptor()
     */
    @Override
    public ImageDescriptor getDisabledImageDescriptor() {
        return _openAction.getDisabledImageDescriptor();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.action.Action#getHoverImageDescriptor()
     */
    @Override
    public ImageDescriptor getHoverImageDescriptor() {
        return _openAction.getHoverImageDescriptor();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.action.Action#getImageDescriptor()
     */
    @Override
    public ImageDescriptor getImageDescriptor() {
        return _openAction.getImageDescriptor();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.action.Action#getMenuCreator()
     */
    @Override
    public IMenuCreator getMenuCreator() {
        return _openAction.getMenuCreator();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.action.Action#getStyle()
     */
    @Override
    public int getStyle() {
        return _openAction.getStyle();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.action.Action#getText()
     */
    @Override
    public String getText() {
        return super.getText();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.action.Action#getToolTipText()
     */
    @Override
    public String getToolTipText() {
        return _openAction.getToolTipText();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.action.Action#isEnabled()
     */
    @Override
    public boolean isEnabled() {
        return (_selectedElement != null) || _openAction.isEnabled();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.action.Action#isHandled()
     */
    @Override
    public boolean isHandled() {
        return (_selectedElement != null) || _openAction.isHandled();
    }

}