/** | |
* <copyright> | |
* | |
* Copyright (c) 2008-2019 See4sys, itemis and others. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License v1.0 | |
* which accompanies this distribution, and is available at | |
* http://www.eclipse.org/legal/epl-v10.html | |
* | |
* Contributors: | |
* See4sys - Initial API and implementation | |
* itemis - [442342] Sphinx doen't trim context information from proxy URIs when serializing proxyfied cross-document references | |
* | |
* </copyright> | |
*/ | |
package org.eclipse.sphinx.emf.internal.ecore.proxymanagement.blacklist; | |
import java.util.ArrayList; | |
import java.util.Collection; | |
import java.util.HashSet; | |
import java.util.Map; | |
import java.util.Set; | |
import java.util.WeakHashMap; | |
import org.eclipse.core.resources.IProject; | |
import org.eclipse.core.resources.IResourceChangeEvent; | |
import org.eclipse.core.resources.IResourceChangeListener; | |
import org.eclipse.core.resources.IResourceDelta; | |
import org.eclipse.core.resources.ResourcesPlugin; | |
import org.eclipse.core.runtime.CoreException; | |
import org.eclipse.emf.common.util.TreeIterator; | |
import org.eclipse.emf.common.util.URI; | |
import org.eclipse.emf.ecore.EClass; | |
import org.eclipse.emf.ecore.EObject; | |
import org.eclipse.emf.ecore.InternalEObject; | |
import org.eclipse.emf.ecore.resource.Resource; | |
import org.eclipse.emf.ecore.resource.ResourceSet; | |
import org.eclipse.sphinx.emf.Activator; | |
import org.eclipse.sphinx.emf.resource.ExtendedResourceSet; | |
import org.eclipse.sphinx.platform.util.ExtendedPlatform; | |
import org.eclipse.sphinx.platform.util.PlatformLogUtil; | |
/** | |
* | |
*/ | |
// TODO Add JavaDoc comments. | |
// FIXME aakar: make access to index thread safe | |
public class MapModelIndex implements IResourceChangeListener { | |
private Map<String, Object> index; | |
private Set<URI> proxyURIs; | |
private MapResourceDeltaVisitor resourceDeltaVisitor; | |
public MapModelIndex() { | |
index = new WeakHashMap<String, Object>(); | |
proxyURIs = new HashSet<URI>(); | |
resourceDeltaVisitor = new MapResourceDeltaVisitor(); | |
startListening(); | |
} | |
public void startListening() { | |
if (ExtendedPlatform.IS_PLATFORM_RUNNING && ExtendedPlatform.IS_WORKSPACE_AVAILABLE) { | |
ResourcesPlugin.getWorkspace().addResourceChangeListener(this); | |
} | |
} | |
public void stopListening() { | |
if (ExtendedPlatform.IS_PLATFORM_RUNNING && ExtendedPlatform.IS_WORKSPACE_AVAILABLE) { | |
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); | |
} | |
} | |
public void clearAll() { | |
index.clear(); | |
proxyURIs.clear(); | |
} | |
public void dispose() { | |
stopListening(); | |
index.clear(); | |
proxyURIs.clear(); | |
} | |
public boolean exists(URI fragmentUri) { | |
return false; | |
} | |
public boolean existsProxyURI(URI proxyURI) { | |
return proxyURIs.contains(proxyURI); | |
} | |
/** | |
* @return true if the proxy URIs set did not already contain the specified element. | |
*/ | |
public boolean addProxyURI(URI proxyURI) { | |
if (proxyURIs.add(proxyURI)) { | |
// System.out.println("Added Proxy: " + proxyURIs.size() + " " + proxyURI); //$NON-NLS-1$ //$NON-NLS-2$ | |
return true; | |
} else { | |
// System.out.println("Trying to add existing proxy: " + proxyURIs.size() + " " + proxyURI); | |
// //$NON-NLS-1$//$NON-NLS-2$ | |
return false; | |
} | |
} | |
/** | |
* @return true if the proxy URIs set contained the specified element. | |
*/ | |
public boolean removeProxyURI(URI proxyURI) { | |
if (proxyURIs.remove(proxyURI)) { | |
// System.out.println("Removed Proxy: " + proxyURIs.size() + " " + proxyURI); //$NON-NLS-1$ //$NON-NLS-2$ | |
return true; | |
} else { | |
// System.out.println("Trying to remove proxy: " + proxyURIs.size() + " " + proxyURI); //$NON-NLS-1$ | |
// //$NON-NLS-2$ | |
return false; | |
} | |
} | |
/** | |
* Removes the proxyURI from the black list on certain conditions. | |
*/ | |
public void updateIndexOnResourceLoaded(Resource resource) { | |
if (resource != null && !resource.getContents().isEmpty()) { | |
for (URI proxyURI : new ArrayList<URI>(proxyURIs)) { | |
// FIXME Potential EMF bug: NumberFormatExeption raised in XMIResourceImpl#getEObject(String) upon | |
// unexpected URI fragment format. | |
try { | |
// If proxy URI is not fragment-based, i.e. includes segments pointing at the target resource, we | |
// have to make sure that it matches URI of loaded resource | |
URI targetResourceURI = proxyURI.trimFragment(); | |
ResourceSet resourceSet = resource.getResourceSet(); | |
if (resourceSet instanceof ExtendedResourceSet) { | |
targetResourceURI = ((ExtendedResourceSet) resourceSet).trimProxyContextInfo(targetResourceURI); | |
} | |
if (proxyURI.segmentCount() == 0 || resource.getURI().equals(targetResourceURI)) { | |
// Remove the proxyURI from the list and do not try to resolve it to avoid costly resolution in | |
// case of a large number of unresolved proxies | |
removeProxyURI(proxyURI); | |
} | |
} catch (Exception ex) { | |
// Ignore exception | |
} | |
} | |
} | |
} | |
public void updateIndexOnResourceUnloaded(Resource resource) { | |
if (resource != null) { | |
TreeIterator<EObject> iterator = resource.getAllContents(); | |
while (iterator.hasNext()) { | |
EObject currentObject = iterator.next(); | |
if (currentObject.eIsProxy() && existsProxyURI(((InternalEObject) currentObject).eProxyURI())) { | |
removeProxyURI(((InternalEObject) currentObject).eProxyURI()); | |
} | |
} | |
} | |
} | |
public Collection<URI> findInstances(EClass class1, IProject scope) { | |
return null; | |
} | |
public Collection<URI> findReferencesTo(EObject object, IProject scope) { | |
return null; | |
} | |
@Override | |
public void resourceChanged(IResourceChangeEvent event) { | |
try { | |
IResourceDelta delta = event.getDelta(); | |
if (delta != null) { | |
delta.accept(resourceDeltaVisitor); | |
} | |
} catch (CoreException exc) { | |
PlatformLogUtil.logAsError(Activator.getPlugin(), "Error indexing models" + exc); //$NON-NLS-1$ | |
} | |
} | |
public void reIndex() throws Exception { | |
// TODO To be implemented? | |
} | |
} |