package org.eclipse.dltk.tcl.parser.definitions;
import java.io.IOException;
import java.net.URL;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.dltk.tcl.definitions.Command;
import org.eclipse.dltk.tcl.definitions.Scope;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
public class DefinitionManager {
private static DefinitionManager sInstance;
private Map<String, Scope> scopes;
private Map<URI, EObject> eobjectCache = new HashMap<>();
private DefinitionManager() {
}
public Map<URI, EObject> getEobjectCache() {
return eobjectCache;
}
private void initialize() {
if (scopes == null) {
scopes = new HashMap<>();
Map<URL, String> extentions = DefinitionExtensionManager
.getInstance().getExtentions();
URL[] locations = DefinitionExtensionManager.getInstance()
.getLocations();
for (URL location : locations) {
try {
Scope scope = DefinitionLoader.loadDefinitions(location);
scopes.put(extentions.get(location), scope);
fillEObjects(scope);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private void fillEObjects(Scope scope) {
EList<Scope> children = scope.getChildren();
for (Scope child : children) {
fillEObjects(child);
}
if (scope instanceof Command) {
Command command = (Command) scope;
eobjectCache.put(EcoreUtil.getURI(command), command);
}
}
public Scope getScope(String name) {
initialize();
return scopes.get(name);
}
public Scope[] getScopes() {
initialize();
Collection<Scope> values = scopes.values();
return values.toArray(new Scope[values.size()]);
}
public NamespaceScopeProcessor createProcessor(String name) {
NamespaceScopeProcessor processor = new NamespaceScopeProcessor();
Scope scope = getScope(name);
if (scope != null)
processor.addScope(scope);
return processor;
}
public NamespaceScopeProcessor createProcessor() {
return new NamespaceScopeProcessor(internalCoreProcessor());
}
public NamespaceScopeProcessor createNewProcessor() {
NamespaceScopeProcessor processor = new NamespaceScopeProcessor();
Scope[] scopes = getScopes();
for (Scope scope : scopes) {
processor.addScope(scope);
}
return processor;
}
private NamespaceScopeProcessor coreProcessor = null;
private NamespaceScopeProcessor internalCoreProcessor() {
if (coreProcessor == null) {
coreProcessor = createNewProcessor();
}
return coreProcessor;
}
/**
* Use {@link #createProcessor()} since now they do the same.
*
* @return
*/
@Deprecated
public NamespaceScopeProcessor getCoreProcessor() {
return createProcessor();
}
public static synchronized DefinitionManager getInstance() {
if (sInstance == null) {
sInstance = new DefinitionManager();
}
return sInstance;
}
}