package org.archstudio.xarchadt; import static org.archstudio.sysutils.SystemUtils.emptyIfNull; import java.util.List; import org.archstudio.xadl3.xadlcore_3_0.Extension; import org.archstudio.xarchadt.internal.EFactoryProxy; import org.archstudio.xarchadt.internal.EObjectProxy; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EFactory; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import com.google.common.base.Function; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @NonNullByDefault public final class XArchADTProxy { public static final <T extends EObject> T proxy(IXArchADT xarch, ObjRef objRef) { return EObjectProxy.proxy(xarch, objRef); } public static final <T extends EObject> List<T> proxy(final IXArchADT xarch, Iterable<ObjRef> objRefs) { return Lists.newArrayList(EObjectProxy.<T> proxy(xarch, objRefs)); } public static final <T extends EObject> List<T> proxy(final IXArchADT xarch, ObjRef... objRefs) { return Lists.newArrayList(EObjectProxy.<T> proxy(xarch, emptyIfNull(objRefs))); } public static final ObjRef unproxy(EObject eObject) { return EObjectProxy.unproxy(eObject); } public static final List<ObjRef> unproxy(Iterable<? extends EObject> eObjects) { return Lists.newArrayList(Iterables.transform(eObjects, new Function<EObject, ObjRef>() { @Override public ObjRef apply(EObject input) { return EObjectProxy.unproxy(input); } })); } public static final <T extends EFactory> T proxy(IXArchADT xarch, String nsURI) { return EFactoryProxy.proxy(xarch, nsURI); } public static final String unproxy(EFactory factory) { return EFactoryProxy.unproxy(factory); } public static <T extends EObject> T create(IXArchADT xarch, EClass eClass) { return XArchADTProxy.proxy(xarch, xarch.create(eClass.getEPackage().getNsURI(), eClass.getName())); } @SuppressWarnings("unchecked") public static @Nullable <T extends Extension> T getExtension(IXArchADT xarch, EObject baseEObject, EClass extensionEClass, boolean create) { EStructuralFeature ext = baseEObject.eClass().getEStructuralFeature("ext"); if (ext == null) { if (create) { throw new IllegalArgumentException(baseEObject.eClass().getName() + " does not support extensions."); } return null; } for (EObject eObject : (EList<EObject>) baseEObject.eGet(ext)) { if (extensionEClass.isInstance(eObject)) { return (T) eObject; } } if (create) { T eObject = create(xarch, extensionEClass); xarch.add(XArchADTProxy.unproxy(baseEObject), "ext", XArchADTProxy.unproxy(eObject)); return eObject; } return null; } public static IXArchADT getXArchADT(EObject eObject) { return EObjectProxy.getXArchADT(eObject); } }