package org.eclipselabs.spray.generator.graphiti.util;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipselabs.spray.mm.spray.Diagram;
import org.eclipselabs.spray.mm.spray.MetaAttribute;
import org.eclipselabs.spray.mm.spray.MetaClass;
import org.eclipselabs.spray.mm.spray.MetaReference;
import com.google.common.collect.Iterables;
public class MetaModel {
public static String fullPackageName(EClassifier eClass) {
EPackage pack = eClass.getEPackage();
String result = pack.getName();
while (pack.getESuperPackage() != null) {
pack = pack.getESuperPackage();
result = pack.getName() + "." + result;
}
if (getBasePackage(eClass) != null) {
result = getBasePackage(eClass) + "." + result;
}
return result;
}
static public String fullyQualifiedPackageNameEClass(EClass cls) {
return fullPackageName(cls);
}
static public String fullyQualifiedNameEClass(EClass cls) {
return fullyQualifiedPackageNameEClass(cls) + "." + cls.getName();
}
static protected ResourceSet set = null;
static protected String metaURI = null;
static protected Resource metaModelEcoreResource = null;
static protected Resource metaModelGenmodelResource = null;
private static String basePackage = null;
public static String getBasePackage(EClassifier eClassifier) {
EPackage pack = eClassifier.getEPackage();
URI genModelLoc = EcorePlugin.getEPackageNsURIToGenModelLocationMap().get(pack.getNsURI());
if (genModelLoc == null) {
throw new IllegalStateException("No genmodel found for package URI " + pack.getNsURI() + ". If you are running in stanalone mode make sure register the genmodel file.");
}
ResourceSet rs = new ResourceSetImpl();
Resource genModelResource = rs.getResource(genModelLoc, true);
for (GenModel g : Iterables.filter(genModelResource.getContents(), GenModel.class)) {
for (GenPackage genPack : g.getGenPackages()) {
if (genPack.getEcorePackage() == pack) {
return genPack.getBasePackage();
}
}
}
return null;
}
static public List<EClassifier> getClasifiers(EPackage p) {
List<EClassifier> result = new ArrayList<EClassifier>();
result.addAll(p.getEClassifiers());
for (EPackage sub : p.getESubpackages()) {
result.addAll(getClasifiers(sub));
}
return result;
}
static public EClass findEClass(Diagram diagram, String className) {
for (MetaClass mc : diagram.getMetaClasses()) {
if (className.equals(mc.getType().getName())) {
return mc.getType();
}
}
return null;
}
static public MetaClass findMetaClass(MetaReference ref) {
if (ref.getMetaClass() != null) {
return ref.getMetaClass();
} else if (ref.getContainer() != null) {
return ref.getContainer().getRepresents();
}
return null;
}
static public MetaClass findMetaClass(MetaAttribute ref) {
if (ref.getContainer() != null) {
return ref.getContainer().getRepresents();
}
return null;
}
static public List<EClassifier> getMetaClassesInResource(Resource res) {
List<EClassifier> result = new ArrayList<EClassifier>();
EcoreUtil.resolveAll(res);
EList<EObject> c = res.getContents();
for (EObject eObject : c) {
if (eObject instanceof EClass) {
EClass cls = (EClass) eObject;
result.add(cls);
} else if (eObject instanceof EPackage) {
EPackage p = ((EPackage) eObject);
result.addAll(getClasifiers(p));
} else {
}
}
return result;
}
static public Resource getResource(EObject obj) {
return obj.eResource();
}
static public List<EClass> getSubclasses(EClass obj) {
Resource res = obj.eResource();
List<EClass> result = new ArrayList<EClass>();
for (Iterator iterator = res.getAllContents(); iterator.hasNext();) {
EObject eObject = (EObject) iterator.next();
if (eObject instanceof EClass) {
EClass eClass = (EClass) eObject;
if (eClass.getEAllSuperTypes().contains(obj)) {
result.add(eClass);
}
}
}
return result;
}
}