package com.sap.furcas.runtime.referenceresolving;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.ecore.EPackage;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import com.sap.emf.bundlelistener.EcorePackageLoadListener;
import com.sap.emf.ocl.trigger.TriggerManager;
import com.sap.furcas.runtime.syntaxprovider.SyntaxProvider;
/**
* This class implements the com.sap.emf.bundlelistener extension point <code>emf_bundle_listener</code>,
* implementing the {@link EcorePackageLoadListener} interface. As such, it receives update notifications whenever an
* Ecore package's bundle is started for a package that is registered with the Ecore <code>generated_package</code>
* extension point. These packages end up in the {@link EPackage.Registry#INSTANCE default package registry}.<p>
*
* @author Axel Uhl (d043530)
*/
public class Activator implements BundleActivator, EcorePackageLoadListener {
private static Logger log = Logger.getLogger("SyntaxRegistry");
private static final String EXTENSION_POINT_ID = "furcas_syntax";
private static final String METAMODEL_PROPERTY_NAME = "metamodel";
/**
* The values are the extensions specifying as the "provider_class" attribute the fully-qualified
* class name of the {@link SyntaxProvider} class.
*/
private Map<String, Set<IConfigurationElement>> metamodelNsURIToSyntaxProviders;
private static Activator instance;
private SyntaxRegistry registry;
/**
* Load all SyntaxProvider Implementations.
*/
@Override
public void start(BundleContext context) throws Exception {
instance = this;
registry = new SyntaxRegistry();
metamodelNsURIToSyntaxProviders = new HashMap<String, Set<IConfigurationElement>>();
for (IConfigurationElement listenerConfig : Platform.getExtensionRegistry().getConfigurationElementsFor(
context.getBundle().getSymbolicName()+"."+EXTENSION_POINT_ID)) {
for (IConfigurationElement metamodelElement : listenerConfig.getChildren(METAMODEL_PROPERTY_NAME)) {
String metamodelURI = metamodelElement.getAttribute("nsURI");
Set<IConfigurationElement> syntaxProviders = metamodelNsURIToSyntaxProviders.get(metamodelURI);
if (syntaxProviders == null) {
syntaxProviders = new HashSet<IConfigurationElement>();
metamodelNsURIToSyntaxProviders.put(metamodelURI, syntaxProviders);
}
syntaxProviders.add(listenerConfig);
}
}
}
@Override
public void stop(BundleContext context) throws Exception {
}
SyntaxRegistry getSyntaxRegistry() {
return registry;
}
/**
* If syntaxes are registered for the Ecore package identified by <code>nsURI</code> then those syntaxes'
* {@link SyntaxProvider providers} are fetched, their syntaxes are retrieved and their {@link TriggerManager}s
* constructed.
* <p>
*
* By means of synchronization, concurrently registering all already loaded packages won't run out of synch.
*/
@Override
public synchronized void packageLoaded(String nsURI) {
Set<IConfigurationElement> syntaxProviderConfigs = metamodelNsURIToSyntaxProviders.get(nsURI);
if (syntaxProviderConfigs != null) {
for (IConfigurationElement syntaxProviderConfig : syntaxProviderConfigs) {
try {
SyntaxProvider syntaxProvider = (SyntaxProvider) syntaxProviderConfig.createExecutableExtension("provider_class");
syntaxProvider.registerForIncrementalEvaluation(registry);
} catch (Exception e) {
log.throwing(Activator.class.getName(), "packageLoaded", e);
}
}
}
}
public static Activator getDefault() {
return instance;
}
}