/** * <copyright> * </copyright> * * */ package org.feature.multi.perspective.mapping.viewmapping.resource.mtext.util; /** * A utility class to resolve proxy objects that allows to terminate resolving. */ public class MtextInterruptibleEcoreResolver { private boolean terminate = false; public void terminate() { terminate = true; } /** * Visits all proxies in the resource set and tries to resolve them. * * @param resourceSet the objects to visit. */ public void resolveAll(org.eclipse.emf.ecore.resource.ResourceSet resourceSet) { java.util.List<org.eclipse.emf.ecore.resource.Resource> resources = resourceSet.getResources(); for (int i = 0; i < resources.size() && !terminate; i++) { resolveAll(resources.get(i)); } } /** * Visits all proxies in the resource and tries to resolve them. * * @param resource the objects to visit. */ public void resolveAll(org.eclipse.emf.ecore.resource.Resource resource) { for (org.eclipse.emf.ecore.EObject eObject : resource.getContents()) { if (terminate) { return; } resolveAll(eObject); } } /** * Visits all proxies referenced by the object and recursively any of its * contained objects. * * @param eObject the object to visit. */ public void resolveAll(org.eclipse.emf.ecore.EObject eObject) { eObject.eContainer(); resolveCrossReferences(eObject); for (java.util.Iterator<org.eclipse.emf.ecore.EObject> i = eObject.eAllContents(); i.hasNext();) { if (terminate) { return; } org.eclipse.emf.ecore.EObject childEObject = i.next(); resolveCrossReferences(childEObject); } } protected void resolveCrossReferences(org.eclipse.emf.ecore.EObject eObject) { for (java.util.Iterator<org.eclipse.emf.ecore.EObject> i = eObject.eCrossReferences().iterator(); i.hasNext(); i.next()) { // The loop resolves the cross references by visiting them. if (terminate) { return; } } } /** * Searches for all unresolved proxy objects in the given resource. * * @param resource * * @return all proxy objects that are not resolvable */ public java.util.Set<org.eclipse.emf.ecore.EObject> findUnresolvedProxies(org.eclipse.emf.ecore.resource.Resource resource) { java.util.Set<org.eclipse.emf.ecore.EObject> unresolvedProxies = new java.util.LinkedHashSet<org.eclipse.emf.ecore.EObject>(); for (java.util.Iterator<org.eclipse.emf.ecore.EObject> elementIt = org.eclipse.emf.ecore.util.EcoreUtil.getAllContents(resource, true); elementIt.hasNext(); ) { org.eclipse.emf.ecore.InternalEObject nextElement = (org.eclipse.emf.ecore.InternalEObject) elementIt.next(); if (terminate) { return unresolvedProxies; } if (nextElement.eIsProxy()) { unresolvedProxies.add(nextElement); } for (org.eclipse.emf.ecore.EObject crElement : nextElement.eCrossReferences()) { if (terminate) { return unresolvedProxies; } crElement = org.eclipse.emf.ecore.util.EcoreUtil.resolve(crElement, resource); if (crElement.eIsProxy()) { unresolvedProxies.add(crElement); } } } return unresolvedProxies; } /** * Searches for all unresolved proxy objects in the given resource set. * * @param resourceSet * * @return all proxy objects that are not resolvable */ public java.util.Set<org.eclipse.emf.ecore.EObject> findUnresolvedProxies(org.eclipse.emf.ecore.resource.ResourceSet resourceSet) { java.util.Set<org.eclipse.emf.ecore.EObject> unresolvedProxies = new java.util.LinkedHashSet<org.eclipse.emf.ecore.EObject>(); for (org.eclipse.emf.ecore.resource.Resource resource : resourceSet.getResources()) { if (terminate) { return unresolvedProxies; } unresolvedProxies.addAll(findUnresolvedProxies(resource)); } return unresolvedProxies; } }