package jetbrains.mps.lang.dataFlow; /*Generated by MPS */ import jetbrains.mps.util.annotation.ToRemove; import jetbrains.mps.components.CoreComponent; import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import jetbrains.mps.classloading.ClassLoaderManager; import jetbrains.mps.classloading.MPSClassesListener; import jetbrains.mps.classloading.MPSClassesListenerAdapter; import java.util.Set; import jetbrains.mps.module.ReloadableModuleBase; import java.util.Map; import java.util.HashMap; import jetbrains.mps.smodel.MPSModuleRepository; import jetbrains.mps.lang.dataFlow.framework.Program; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.smodel.Language; import jetbrains.mps.smodel.ModuleRepositoryFacade; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModuleOperations; import jetbrains.mps.util.SNodeOperations; import org.apache.log4j.Level; /** * * @deprecated use {@link jetbrains.mps.lang.dataFlow.MPSProgramBuilder } directly to build program */ @Deprecated @ToRemove(version = 3.4) public class DataFlowManager implements CoreComponent { private static final Logger LOG = LogManager.getLogger(DataFlowManager.class); private static DataFlowManager INSTANCE; private final ClassLoaderManager myManager; private final MPSClassesListener myListener = new MPSClassesListenerAdapter() { @Override public void beforeClassesUnloaded(Set<? extends ReloadableModuleBase> modules) { DataFlowManager.this.clear(); } }; private Map<String, DataFlowBuilder> myBuilders = new HashMap<String, DataFlowBuilder>(); private boolean myLoaded = false; @Deprecated public DataFlowManager(MPSModuleRepository moduleRepository, ClassLoaderManager manager) { myManager = manager; } @Override public void init() { if (INSTANCE != null) { throw new IllegalStateException("double initialization"); } INSTANCE = this; myManager.addClassesHandler(myListener); } @Override public void dispose() { myManager.removeClassesHandler(myListener); INSTANCE = null; } public void register(String conceptFqName, DataFlowBuilder builder) { this.myBuilders.put(conceptFqName, builder); } public Program buildProgramFor(SNode node) { checkLoaded(); return new MPSProgramBuilder(this).buildProgram(node); } /*package*/ DataFlowBuilder getBuilderFor(String concept) { checkLoaded(); return this.myBuilders.get(concept); } private void clear() { myBuilders.clear(); myLoaded = false; } private synchronized void checkLoaded() { if (myLoaded) { return; } myLoaded = true; this.load(); } private void load() { for (Language l : ModuleRepositoryFacade.getInstance().getAllModules(Language.class)) { SModel dfaModel = SModuleOperations.getAspect(l, "dataFlow"); if (dfaModel != null && dfaModel.getRootNodes().iterator().hasNext()) { String dfaBuildersClassName = SNodeOperations.getModelLongName(dfaModel) + ".DFABuilders"; Class<? extends DataFlowBuilders> buildersClass = null; try { buildersClass = ((Class<? extends DataFlowBuilders>) l.getOwnClass(dfaBuildersClassName)); } catch (ClassNotFoundException ignored) { } if (buildersClass != null) { try { DataFlowBuilders builders = buildersClass.newInstance(); builders.install(this); } catch (InstantiationException e) { if (LOG.isEnabledFor(Level.ERROR)) { LOG.error("", e); } } catch (IllegalAccessException e) { if (LOG.isEnabledFor(Level.ERROR)) { LOG.error("", e); } } } } } } public static DataFlowManager getInstance() { return INSTANCE; } }