package org.sugarj; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.Platform; import org.osgi.framework.Bundle; import org.osgi.framework.BundleException; import org.sugarj.common.Log; /** * Registry for active base languages. A base language should register here * on activation. The editor and compiler query this registry to receive language * libraries. * * @author seba */ public class BaseLanguageRegistry { private boolean extensionsLoaded = false; private Map<String, AbstractBaseLanguage> baseLanguages = new HashMap<String, AbstractBaseLanguage>(); private static BaseLanguageRegistry instance = new BaseLanguageRegistry(); private BaseLanguageRegistry() { } public static BaseLanguageRegistry getInstance() { return instance; } public synchronized void registerBaseLanguage(AbstractBaseLanguage baseLang) { baseLanguages.put(baseLang.getSugarFileExtension(), baseLang); if (baseLang.getBaseFileExtension() != null) baseLanguages.put(baseLang.getBaseFileExtension(), baseLang); } public synchronized void unregisterBaseLanguage(AbstractBaseLanguage baseLang) { AbstractBaseLanguage reg = baseLanguages.get(baseLang.getSugarFileExtension()); if (reg != null && reg.equals(baseLang)) baseLanguages.remove(baseLang.getSugarFileExtension()); if (baseLang.getBaseFileExtension() != null) { reg = baseLanguages.get(baseLang.getBaseFileExtension()); if (reg != null && reg.equals(baseLang)) baseLanguages.remove(baseLang.getBaseFileExtension()); } } public synchronized AbstractBaseLanguage getBaseLanguage(String extension) { if (!extensionsLoaded) loadExtensions(); return baseLanguages.get(extension); } public synchronized AbstractBaseLanguage getBaseLanguageByName(String languageName) { if (!extensionsLoaded) loadExtensions(); for(AbstractBaseLanguage language : baseLanguages.values()) { if(language.getLanguageName().equals(languageName)) return language; } return null; } public synchronized boolean isRegistered(String extension) { if (!extensionsLoaded) loadExtensions(); return baseLanguages.containsKey(extension); } private synchronized void loadExtensions() { extensionsLoaded = true; if (!Platform.isRunning()) return; IExtensionRegistry registry = Platform.getExtensionRegistry(); IExtensionPoint extensionPoint = registry.getExtensionPoint("org.sugarj.language"); IConfigurationElement[] members = extensionPoint.getConfigurationElements(); for (IConfigurationElement activatorConf : members) { String pluginId = activatorConf.getAttribute("id"); loadLanguagePlugin(pluginId); } } public synchronized Bundle loadLanguagePlugin(String pluginId) { Bundle bundle = Platform.getBundle(pluginId); if (bundle == null) Log.log.logErr("Could not load language plugin " + pluginId, Log.ALWAYS); else if (bundle.getState() != Bundle.ACTIVE) try { bundle.start(); } catch (BundleException e) { Log.log.logErr("Could not start language plugin " + pluginId, Log.ALWAYS); } return bundle; } public synchronized List<String> getRegisteredFileExtensions() { if (!extensionsLoaded) loadExtensions(); List<String> list = new LinkedList<String>(); for (Entry<String, AbstractBaseLanguage> entry : baseLanguages.entrySet()) if (entry.getKey().equals(entry.getValue().getSugarFileExtension())) list.add(entry.getValue().getSugarFileExtension()); return list; } }