package org.reuseware.air.coconut;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import org.reuseware.air.language.componentmodel.ComponentmodelPackage;
public class InterpreterRegistry {
private static InterpreterRegistry instance = null;
private Map<EClass, IUpperLevelInterpreter> upperLevelInterpreters = null;
private InterpreterRegistry(){
upperLevelInterpreters = new HashMap<EClass, IUpperLevelInterpreter>();
putInterpreterModule(ComponentmodelPackage.eINSTANCE.getComposer(), new ComplexComposerInterpreter());
}
public static InterpreterRegistry getInstance(){
if(instance==null)
instance = new InterpreterRegistry();
return instance;
}
private void putInterpreterModule(EClass construct, IUpperLevelInterpreter interpreter) {
upperLevelInterpreters.put(construct, interpreter);
}
public IUpperLevelInterpreter getInterpreterModule(EClass construct) {
IUpperLevelInterpreter interpreter = null;
List<EClass> c = new ArrayList<EClass>(1);
c.add(construct);
interpreter = resolveInterpreter(c);
return interpreter;
}
/**
* @param language - the language package namespace URI
* @param construct - the EClass name
* @param interpreter - the implemented interpreter
*/
public void putInterpreterModule(String language, String construct, IUpperLevelInterpreter interpreter) {
EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(language);
EClass eClass = (EClass) ePackage.getEClassifier(construct);
upperLevelInterpreters.put(eClass, interpreter);
}
/**
* Recursive function for super-classes.
*/
private IUpperLevelInterpreter resolveInterpreter(List<EClass> constructs) {
IUpperLevelInterpreter interpreter = null;
List<EClass> superConstructs = new ArrayList<EClass>();
for(EClass c : constructs) {
interpreter = upperLevelInterpreters.get(c);
if (interpreter != null) {
break;
}
superConstructs.addAll(c.getESuperTypes());
}
if (interpreter == null && !superConstructs.isEmpty()) {
interpreter = resolveInterpreter(superConstructs);
}
return interpreter;
}
}