package no.playtrd.runtime; import java.util.ArrayList; import java.util.Collection; import java.util.List; import no.playtrd.Activator; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; public abstract class AbstractRuntime extends LifeCycleImpl implements IAdaptable { private IAdaptable context; public AbstractRuntime(IAdaptable context) { this.context = context; } public static abstract class Component extends LifeCycleImpl implements IAdaptable { protected final AbstractRuntime runtime; public Component(AbstractRuntime runtime) { this.runtime = runtime; } public AbstractRuntime getRuntime() { return runtime; } public Object getAdapter(Class adapter) { if (adapter.isInstance(this)) { return this; } return null; } } protected Collection<Component> runtimeComponents = new ArrayList<AbstractRuntime.Component>(); protected void addRuntimeComponent(Component comp) { if (! runtimeComponents.contains(comp)) { runtimeComponents.add(comp); } } public Object getAdapter(Class adapter) { for (Component component: runtimeComponents) { Object o = component.getAdapter(adapter); if (o != null) { return o; } } return null; } public <T> T getContextAdapter(Class<T> adapter) { return (context != null ? (T)context.getAdapter(adapter) : null); } @Override protected void doStart() { doLifeCycleTransition(runtimeComponents, this.lifeCycleState, RUNNING); super.doStart(); } @Override protected void doPause() { doLifeCycleTransition(runtimeComponents, this.lifeCycleState, PAUSED); super.doPause(); } @Override protected void doResume() { doLifeCycleTransition(runtimeComponents, this.lifeCycleState, RUNNING); super.doResume(); } @Override protected void doStop() { doLifeCycleTransition(runtimeComponents, this.lifeCycleState, PAUSED); super.doStop(); } @Override protected void doRestart() { doLifeCycleTransition(runtimeComponents, this.lifeCycleState, PAUSED); super.doRestart(); } // public static <T> T getEObject(ResourceSet resourceSet, Class<T> clazz, int severity) { List<T> eObjects = getEObjects(resourceSet, clazz, 1, 1, severity); return (eObjects.size() > 0 ? eObjects.get(0) : null); } public static <T> T getEObject(TreeIterator<EObject> allContents, Class<T> clazz, int severity) { List<T> eObjects = getEObjects(allContents, clazz, 1, 1, severity); return (eObjects.size() > 0 ? eObjects.get(0) : null); } public static <T> List<T> getEObjects(ResourceSet resourceSet, Class<T> clazz, int minCount, int maxCount, int severity) { List<T> eObjects = new ArrayList<T>(); for (Resource resource: resourceSet.getResources()) { getEObjects(resource.getAllContents(), clazz, maxCount, eObjects); } return checkEObjects(eObjects, clazz, minCount, maxCount, severity); } protected static <T> List<T> checkEObjects(List<T> eObjects, Class<T> clazz, int minCount, int maxCount,int severity) { if (eObjects.size() < minCount && severity >= 0) { Activator.getDefault().log(severity, "Didn't find between " + minCount + " and " + maxCount + " objects of " + clazz); } return eObjects; } public static <T> List<T> getEObjects(TreeIterator<EObject> allContents, Class<T> clazz, int minCount, int maxCount, int severity) { List<T> eObjects = new ArrayList<T>(); getEObjects(allContents, clazz, maxCount, eObjects); return checkEObjects(eObjects, clazz, minCount, maxCount, severity); } private static <T> void getEObjects(TreeIterator<EObject> allContents, Class<T> clazz, int maxCount, List<T> result) { while (allContents.hasNext()) { Object o = allContents.next(); if (clazz.isInstance(o)) { result.add((T)o); if (maxCount >= 0 && result.size() >= maxCount) { break; } } } } }