/*******************************************************************************
* 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;
}
}