package de.hub.emffrag.util;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import de.hub.emffrag.fragmentation.FInternalObjectImpl;
import de.hub.emffrag.fragmentation.FObjectImpl;
import de.hub.emffrag.fragmentation.FStoreImpl;
import de.hub.emffrag.fragmentation.ReflectiveMetaModelRegistry;
import de.hub.emffrag.model.emffrag.EmfFragPackage;
import de.hub.emffrag.model.emffrag.Extension;
public class Extensions {
public static void add(EObject owner, Extension extension) {
if (owner instanceof FObjectImpl) {
EObject internalExtensionObject = null;
if (extension instanceof FObjectImpl) {
internalExtensionObject = FStoreImpl.getInstance().getInternalObject(extension);
} else {
throw new IllegalArgumentException("Extensions must be FObjects.");
}
((FObjectImpl) owner).fInternalObject().getExtensions().add(internalExtensionObject);
} else {
throw new IllegalArgumentException("Extension owner is not an FObject.");
}
}
@SuppressWarnings("unchecked")
public static <T extends Extension> T get(EObject owner, Class<T> extensionClass) {
if (owner instanceof FObjectImpl) {
for (EObject internalExtension: ((FObjectImpl) owner).fInternalObject().getExtensions()) {
EObject extension = FStoreImpl.getInstance().getUserObject((FInternalObjectImpl)internalExtension);
if (extensionClass.isAssignableFrom(extension.getClass())) {
return (T)extension;
}
}
return null;
} else {
throw new IllegalArgumentException("Extension owner is not an FObject.");
}
}
public static Extension get(EObject owner, EClass theClass, boolean create) {
if (owner instanceof FObjectImpl) {
EList<org.eclipse.emf.ecore.EObject> extensions = ((FObjectImpl) owner).fInternalObject().getExtensions();
EClass internalClass = ReflectiveMetaModelRegistry.instance.getInternalClass(theClass);
for (EObject extension: extensions) {
if (internalClass.isInstance(extension)) {
return (Extension)FStoreImpl.getInstance().getUserObject((FInternalObjectImpl)extension);
}
}
if (create) {
EObject result = theClass.getEPackage().getEFactoryInstance().create(theClass);
if (result instanceof FObjectImpl) {
FInternalObjectImpl internalResult = FStoreImpl.getInstance().getInternalObject(result);
extensions.add(internalResult);
} else {
throw new IllegalArgumentException("Extensions must be FObjects");
}
return (Extension)result;
} else {
return null;
}
} else {
throw new IllegalArgumentException("Extension owner is not an FObject.");
}
}
public static Extension[] getAll(EObject owner) {
if (owner instanceof FObjectImpl) {
get(owner, EmfFragPackage.eINSTANCE.getStatistics(), true);
EList<EObject> extensions = ((FObjectImpl) owner).fInternalObject().getExtensions();
Extension[] result = new Extension[extensions.size()];
int i = 0;
for (EObject extension: extensions) {
result[i++] = (Extension)FStoreImpl.getInstance().getUserObject((FInternalObjectImpl)extension);
}
return result;
} else {
throw new IllegalArgumentException("Extension owner is not an FObject.");
}
}
}