org.jnario.feature.ui.launching.FeatureJavaElementDelegate.java Source code

Java tutorial

Introduction

Here is the source code for org.jnario.feature.ui.launching.FeatureJavaElementDelegate.java

Source

/*******************************************************************************
 * Copyright (c) 2012 BMW Car IT and others.
 * 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 org.jnario.feature.ui.launching;

import java.util.Iterator;

import org.eclipse.core.resources.IFile;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.common.types.JvmIdentifiableElement;
import org.eclipse.xtext.common.types.util.jdt.IJavaElementFinder;
import org.eclipse.xtext.nodemodel.ILeafNode;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.parser.IParseResult;
import org.eclipse.xtext.parsetree.reconstr.impl.NodeIterator;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.xbase.ui.launching.JavaElementDelegateJunitLaunch;
import org.jnario.feature.feature.Feature;
import org.jnario.feature.feature.FeatureFile;
import org.jnario.feature.feature.Scenario;

import com.google.common.collect.Iterables;
import com.google.inject.Inject;

/**
 * @author Sebastian Benz - Initial contribution and API
 * @author Birgit Engelmann
 */
public class FeatureJavaElementDelegate extends JavaElementDelegateJunitLaunch {

    @Inject
    private IJavaElementFinder elementFinder;

    @Override
    protected boolean containsElementsSearchedFor(IFile file) {
        return file.getName().endsWith("Feature.java");
    }

    @Override
    protected JvmIdentifiableElement findAssociatedJvmElement(EObject element) {
        if (element == null) {
            return null;
        }
        EObject toExecute = EcoreUtil2.getContainerOfType(element, Scenario.class);
        if (toExecute == null) {
            toExecute = EcoreUtil2.getContainerOfType(element, Feature.class);
        }
        if (toExecute == null) {
            FeatureFile featureFile = EcoreUtil2.getContainerOfType(element, FeatureFile.class);
            Iterable<Feature> features = Iterables.filter(featureFile.getXtendTypes(), Feature.class);
            Iterator<Feature> iterator = features.iterator();
            if (iterator.hasNext()) {
                toExecute = iterator.next();
            }
        }
        if (toExecute == null) {
            return null;
        }
        return super.findAssociatedJvmElement(toExecute);
    }

    protected IJavaElement findJavaElement(XtextResource resource, int offset) {
        IParseResult parseResult = resource.getParseResult();
        if (parseResult == null)
            return null;
        INode root = parseResult.getRootNode();
        INode node = NodeModelUtils.findLeafNodeAtOffset(root, offset);
        if (node == null)
            return null;

        EObject element = NodeModelUtils.findActualSemanticObjectFor(node);
        if (!(element instanceof Scenario)) {
            INode previousSementic = null, nextSemantic = null;
            NodeIterator backwards = new NodeIterator(node);
            while (backwards.hasPrevious()) {
                INode n = backwards.previous();
                if (n instanceof ILeafNode && !((ILeafNode) n).isHidden()) {
                    previousSementic = n;
                    break;
                }
            }
            NodeIterator forward = new NodeIterator(node);
            while (forward.hasNext()) {
                INode n = forward.next();
                if (n instanceof ILeafNode && !((ILeafNode) n).isHidden()) {
                    nextSemantic = n;
                    break;
                }
            }
            if (previousSementic != null && nextSemantic == null) {
                element = NodeModelUtils.findActualSemanticObjectFor(previousSementic);
            } else if (nextSemantic != null && previousSementic == null) {
                element = NodeModelUtils.findActualSemanticObjectFor(nextSemantic);
            } else {
                EObject prevObj = NodeModelUtils.findActualSemanticObjectFor(previousSementic);
                EObject nextObj = NodeModelUtils.findActualSemanticObjectFor(nextSemantic);
                if (prevObj == null || nextObj == null)
                    return null;
                element = findCommonContainer(prevObj, nextObj);
            }
        }
        JvmIdentifiableElement jvmElement = findAssociatedJvmElement(element);
        if (jvmElement == null)
            return null;
        IJavaElement javaElement = elementFinder.findElementFor(jvmElement);
        return javaElement;
    }

}