org.xpect.model.XpectFileImplCustom.java Source code

Java tutorial

Introduction

Here is the source code for org.xpect.model.XpectFileImplCustom.java

Source

/*******************************************************************************
 * Copyright (c) 2012 itemis AG (http://www.itemis.eu) 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.xpect.model;

import java.util.Map;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.xtext.common.types.JvmDeclaredType;
import org.eclipse.xtext.common.types.JvmType;
import org.eclipse.xtext.common.types.access.IJvmTypeProvider;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.resource.XtextResourceSet;
import org.xpect.Member;
import org.xpect.XpectIgnore;
import org.xpect.XpectInvocation;
import org.xpect.XpectJavaModel;
import org.xpect.XpectTest;
import org.xpect.parameter.IStatementRelatedRegion;
import org.xpect.registry.ITestSuiteInfo;
import org.xpect.registry.LazyClass;
import org.xpect.setup.ISetupInitializer;
import org.xpect.setup.SetupInitializer;
import org.xpect.util.XpectJavaModelManager;

import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;

/**
 * @author Moritz Eysholdt - Initial contribution and API
 */
@SuppressWarnings("restriction")
public class XpectFileImplCustom extends XpectFileImpl {

    private Map<String, XpectInvocation> id2invocation;

    private XpectJavaModel javaModel;

    @Override
    public <T> ISetupInitializer<T> createSetupInitializer() {
        XpectTest test = getTest();
        if (test != null && !test.eIsProxy())
            return new SetupInitializer<T>(test);
        return new ISetupInitializer.Null<T>();
    }

    private XpectJavaModel findJavaModel() {
        XtextResource resource = (XtextResource) eResource();
        ResourceSet resourceSet = (XtextResourceSet) resource.getResourceSet();
        XpectTest test = getTest();
        if (test != null) {
            JvmDeclaredType suite = test.getDeclaredSuite();
            if (suite != null) {
                if (suite.eIsProxy())
                    return null;
                return XpectJavaModelManager.getOrCreate(suite);
            }
        }
        ITestSuiteInfo suiteInfo = ITestSuiteInfo.Registry.INSTANCE.getTestSuite(eResource());
        if (suiteInfo == null)
            return null;
        LazyClass<Object> lazyClass = suiteInfo.getClazz();
        if (lazyClass.getLoader() == null) {
            IJvmTypeProvider iJvmTypeProvider = resource.getResourceServiceProvider()
                    .get(IJvmTypeProvider.Factory.class).findOrCreateTypeProvider(resourceSet);
            JvmType eObject = iJvmTypeProvider.findTypeByName(lazyClass.getName());
            if (eObject instanceof JvmDeclaredType)
                return XpectJavaModelManager.getOrCreate((JvmDeclaredType) eObject);
        } else {
            Class<Object> clazz = lazyClass.load();
            return XpectJavaModelManager.getOrCreate(resourceSet, clazz);
        }
        return null;
    }

    public String getDocument() {
        return ((XtextResource) eResource()).getParseResult().getRootNode().getText();
    }

    @Override
    public XpectInvocation getInvocation(String id) {
        if (id2invocation == null)
            initalizeInvocationsIDs();
        return id2invocation.get(id);
    }

    @Override
    public XpectInvocation getInvocationAt(int offset) {
        if (offset < 0)
            return null;
        EList<Member> members = getMembers();
        for (Member member : members) {
            if (member instanceof XpectInvocation) {
                XpectInvocation invocation = (XpectInvocation) member;
                IStatementRelatedRegion region = invocation.getExtendedRegion();
                int o = region.getOffset();
                int e = o + region.getLength();
                if (o <= offset && offset <= e)
                    return invocation;
            }
        }
        return null;
    }

    @Override
    public Iterable<XpectInvocation> getInvocations() {
        return Iterables.filter(getMembers(), XpectInvocation.class);
    }

    @Override
    public XpectJavaModel getJavaModel() {
        if (javaModel == null)
            javaModel = findJavaModel();
        return javaModel;
    }

    @Override
    public XpectTest getTest() {
        return Iterables.getFirst(Iterables.filter(getMembers(), XpectTest.class), null);
    }

    public void initalizeInvocationsIDs() {
        Map<String, XpectInvocation> id2invocation = Maps.newHashMap();
        Map<String, Integer> counter = Maps.newHashMap();
        for (XpectInvocation inv : getInvocations()) {
            XpectInvocationImplCustom impl = (XpectInvocationImplCustom) inv;
            String name = impl.getMethodName();
            Integer count = counter.get(name);
            count = count == null ? 0 : count + 1;
            counter.put(name, count);
            String id = name + "~" + count;
            impl.setId(id);
            id2invocation.put(id, inv);
        }
        this.id2invocation = id2invocation;
    }

    @Override
    public boolean isIgnore() {
        return !Iterables.isEmpty(Iterables.filter(getMembers(), XpectIgnore.class));
    }

    public void unsetInvocationIDs() {
        if (id2invocation != null) {
            id2invocation = null;
            for (XpectInvocation inv : getInvocations())
                ((XpectInvocationImplCustom) inv).setId(null);
        }
    }

    public void unsetJavaModel() {
        javaModel = null;
    }

}