package org.xpect.util;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.xtext.resource.XtextResourceSet;
import com.google.common.collect.Maps;
public class ResourceSetsByClassloaderContext {
private class Ref extends AdapterImpl {
public ResourceSetsByClassloaderContext getManager() {
return ResourceSetsByClassloaderContext.this;
}
}
public static XtextResourceSet get(ResourceSet rs, Object context) {
if (rs instanceof XtextResourceSet) {
XtextResourceSet xrs = (XtextResourceSet) rs;
if (context.equals(xrs.getClasspathURIContext()))
return xrs;
}
ResourceSetsByClassloaderContext contexts = getOrCreateAdapter(rs);
XtextResourceSet result = contexts.getOrCreateResourceSet(context);
return result;
}
private static ResourceSetsByClassloaderContext getOrCreateAdapter(ResourceSet rs) {
EList<Adapter> adapters = rs.eAdapters();
Iterator<Adapter> it = adapters.iterator();
while (it.hasNext()) {
Adapter a = it.next();
if (a instanceof Ref)
return ((Ref) a).getManager();
}
ResourceSetsByClassloaderContext x = new ResourceSetsByClassloaderContext();
adapters.add(x.new Ref());
if (rs instanceof XtextResourceSet) {
XtextResourceSet xrs = (XtextResourceSet) rs;
Object context = xrs.getClasspathURIContext();
if (context != null)
x.resourceSets.put(context, xrs);
}
return x;
}
private final Map<Object, XtextResourceSet> resourceSets = Maps.newHashMap();
private XtextResourceSet createResourceSet(Object context) {
XtextResourceSet result = new XtextResourceSet();
result.eAdapters().add(new Ref());
resourceSets.put(context, result);
result.setClasspathURIContext(context);
return result;
}
private XtextResourceSet getOrCreateResourceSet(Object context) {
XtextResourceSet result = resourceSets.get(context);
if (result == null)
result = createResourceSet(context);
return result;
}
}