package org.xpect.util;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
import org.eclipse.xtext.common.types.JvmDeclaredType;
import org.eclipse.xtext.common.types.JvmTypeReference;
import org.eclipse.xtext.common.types.access.impl.ClasspathTypeProvider;
import org.eclipse.xtext.common.types.util.TypeReferences;
import org.eclipse.xtext.resource.XtextResourceSet;
import org.xpect.XjmTest;
import org.xpect.XpectConstants;
import org.xpect.XpectJavaModel;
import org.xpect.registry.ILanguageInfo;
import com.google.inject.Injector;
@SuppressWarnings("restriction")
public class XpectJavaModelManager {
public static XpectJavaModel createJavaModel(Class<?> clazz) {
XtextResourceSet rs = new XtextResourceSet();
ClassLoader classLoader = clazz.getClassLoader();
rs.setClasspathURIContext(classLoader);
new ClasspathTypeProvider(classLoader, rs, null);
JvmTypeReference typeReference = getTypeReferences().getTypeForName(clazz, rs);
return createJavaModel(rs, (JvmDeclaredType) typeReference.getType());
}
private static XpectJavaModel createJavaModel(JvmDeclaredType type) {
org.xpect.XpectJavaModelFactory fact = org.xpect.XpectJavaModelFactory.eINSTANCE;
XpectJavaModel result = fact.createXpectJavaModel();
XjmTest test = fact.createXjmTest();
test.setJvmClass(type);
result.setTestOrSuite(test);
return result;
}
private static XpectJavaModel createJavaModel(ResourceSet resourceSet, JvmDeclaredType type) {
XpectJavaModel javaModel = createJavaModel(type);
Resource res = new ResourceImpl(createURI(type.getQualifiedName()));
res.getContents().add(javaModel);
resourceSet.getResources().add(res);
return javaModel;
}
private static URI createURI(String qualifiedName) {
return URI.createURI("xpectjavamodel:/" + qualifiedName);
}
private static XpectJavaModel find(ResourceSet rs, String qualifiedName) {
Resource resource = rs.getResource(createURI(qualifiedName), false);
if (resource != null)
for (EObject o : resource.getContents())
if (o instanceof XpectJavaModel)
return (XpectJavaModel) o;
return null;
}
public static XpectJavaModel getOrCreate(JvmDeclaredType type) {
ResourceSet resourceSet = type.eResource().getResourceSet();
XpectJavaModel result = find(resourceSet, type.getQualifiedName());
if (result != null)
return result;
return createJavaModel(resourceSet, type);
}
public static XpectJavaModel getOrCreate(ResourceSet rs, Class<?> clazz) {
XtextResourceSet xtextResourceSet = ResourceSetsByClassloaderContext.get(rs, clazz.getClassLoader());
XpectJavaModel result = find(xtextResourceSet, clazz.getName());
if (result != null)
return result;
JvmTypeReference type = getTypeReferences().getTypeForName(clazz, xtextResourceSet);
result = createJavaModel(xtextResourceSet, (JvmDeclaredType) type.getType());
return result;
}
private static TypeReferences getTypeReferences() {
Injector injector = ILanguageInfo.Registry.INSTANCE.getLanguageByFileExtension(XpectConstants.XPECT_FILE_EXT).getInjector();
return injector.getInstance(TypeReferences.class);
}
}