/******************************************************************************* * Copyright (c) 2011, 2013 University of Mannheim: Chair for Software Engineering * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Ralph Gerbig - initial API and implementation and initial documentation *******************************************************************************/ package de.uni_mannheim.informatik.swt.mlm.workbench; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.ui.statushandlers.StatusManager; import de.uni_mannheim.informatik.swt.mlm.workbench.interfaces.IDSLService; import de.uni_mannheim.informatik.swt.mlm.workbench.interfaces.IEmendationService; import de.uni_mannheim.informatik.swt.mlm.workbench.interfaces.IGraphicalVisualizationService; import de.uni_mannheim.informatik.swt.mlm.workbench.interfaces.IPopupToolBarProvider; import de.uni_mannheim.informatik.swt.mlm.workbench.interfaces.IProximityIndicationService; import de.uni_mannheim.informatik.swt.mlm.workbench.interfaces.IReasoningService; import de.uni_mannheim.informatik.swt.mlm.workbench.interfaces.ITextualVisualizationService; import de.uni_mannheim.informatik.swt.mlm.workbench.preferences.PreferenceConstants; import de.uni_mannheim.informatik.swt.mlm.workbench.status.MelanieWorkbenchStatus; /** * This class manages loading extension points. Call Instance() to * get an instance of this class. * */ public class ExtensionPointService { private static String TEXTUAL_VISUALIZATION_SERVICE_ID = "de.uni_mannheim.informatik.swt.textualvisualization.service"; private static String GRAPHICAL_VISUALIZATION_SERVICE_ID = "de.uni_mannheim.informatik.swt.graphicalvisualization.service"; private static String REASONING_SERVICE_ID = "de.uni_mannheim.informatik.swt.reasoning.service"; private static String EMENDATION_SERVICE_ID = "de.uni_mannheim.informatik.swt.emendation.service"; private static String PROXIMITY_INDICATION_SERVICE_ID = "de.uni_mannheim.informatik.swt.proximityindication.service"; private static String DSL_SERVICE_ID = "de.uni_mannheim.informatik.swt.dsl.service"; private static String POPUPBARBUTTON_PROVIDER_ID = "de.uni_mannheim.informatik.swt.popupbarbuttons.provider"; private static ExtensionPointService instance = null; /** * Cache for Graphical Visualization IConfigurationElements */ private static Map<String, IConfigurationElement> id2GraphicalVisualizationServiceConfigurationElement; public Map<String, IConfigurationElement> getId2GraphicalVisualizationServiceConfigurationElement() { return id2GraphicalVisualizationServiceConfigurationElement; } /** * Cache for Graphical Visualization Instances */ private static Map<String, IGraphicalVisualizationService> id2GraphicalVisualizationServiceInstance; /** * Cache for Graphical Visualization IConfigurationElements */ private static Map<String, IConfigurationElement> id2TextualVisualizationServiceConfigurationElement; public Map<String, IConfigurationElement> getId2TextualVisualizationServiceConfigurationElement() { return id2TextualVisualizationServiceConfigurationElement; } /** * Cache for Graphical Visualization Instances */ private static Map<String, ITextualVisualizationService> id2TextualVisualizationServiceInstance; /** * Cache for Reasoning IConfigurationElements */ private static Map<String, IConfigurationElement> id2ReasoningServiceConfigurationElement; public Map<String, IConfigurationElement> getId2ReasoningServiceConfigurationElement() { return id2ReasoningServiceConfigurationElement; } /** * Cache for Reasoning Instances */ private static Map<String, IReasoningService> id2ReasoningServiceInstance; /** * Cache for Refactoring IConfigurationElements */ private static Map<String, IConfigurationElement> id2EmendationServiceConfigurationElement; public Map<String, IConfigurationElement> getId2EmendationServiceConfigurationElement() { return id2EmendationServiceConfigurationElement; } /** * Cache for Refactoring Instances */ private static Map<String, IEmendationService> id2EmendationServiceInstance; /** * Cache for Proximity Indication IConfigurationElements */ private static Map<String, IConfigurationElement> id2ProximityIndicationServiceConfigurationElement; public Map<String, IConfigurationElement> getId2ProximityIndicationServiceConfigurationElement() { return id2ProximityIndicationServiceConfigurationElement; } /** * Cache for Proximity Indication Instances */ private static Map<String, IProximityIndicationService> id2ProximityIndicationServiceInstance; /** * Cache for DSL IConfigurationElements */ private static Map<String, IConfigurationElement> id2DSLServiceConfigurationElement; public Map<String, IConfigurationElement> getId2DSLServiceConfigurationElement() { return id2DSLServiceConfigurationElement; } /** * Cache for DSL Instances */ private static Map<String, IDSLService> id2DSLServiceInstance; /** * Cache for IPopupToolBarProvider IConfigurationElements */ private static Map<String, IConfigurationElement> id2IPopupToolBarProviderConfigurationElement; public Map<String, IConfigurationElement> getPopUpBarButtonProviderConfigurationElement() { return id2IPopupToolBarProviderConfigurationElement; } /** * Cache for IPopupToolBarProvider Instances */ private static Map<String, IPopupToolBarProvider> id2IPopupToolBarProviderInstance; private ExtensionPointService(){ } public static ExtensionPointService Instance() { if (instance == null){ instance = new ExtensionPointService(); instance.initialize(); } return instance; } /** * Initializes all IConfigurationElement caches. */ private void initialize(){ //Initialize caches id2TextualVisualizationServiceConfigurationElement = new HashMap<String, IConfigurationElement>(); id2TextualVisualizationServiceInstance = new HashMap<String, ITextualVisualizationService>(); id2GraphicalVisualizationServiceConfigurationElement = new HashMap<String, IConfigurationElement>(); id2GraphicalVisualizationServiceInstance = new HashMap<String, IGraphicalVisualizationService>(); id2ReasoningServiceConfigurationElement = new HashMap<String, IConfigurationElement>(); id2ReasoningServiceInstance = new HashMap<String, IReasoningService>(); id2EmendationServiceConfigurationElement = new HashMap<String, IConfigurationElement>(); id2EmendationServiceInstance = new HashMap<String, IEmendationService>(); id2ProximityIndicationServiceConfigurationElement = new HashMap<String, IConfigurationElement>(); id2ProximityIndicationServiceInstance = new HashMap<String, IProximityIndicationService>(); id2DSLServiceConfigurationElement = new HashMap<String, IConfigurationElement>(); id2DSLServiceInstance = new HashMap<String, IDSLService>(); id2IPopupToolBarProviderConfigurationElement = new HashMap<String, IConfigurationElement>(); id2IPopupToolBarProviderInstance = new HashMap<String, IPopupToolBarProvider>(); //Initialize the textual visualization service IConfigurationElement[] configurationElements = Platform.getExtensionRegistry().getConfigurationElementsFor(TEXTUAL_VISUALIZATION_SERVICE_ID); for (IConfigurationElement cElement : configurationElements) id2TextualVisualizationServiceConfigurationElement.put(cElement.getAttribute("id"), cElement); //Initialize the graphical visualization service configurationElements = Platform.getExtensionRegistry().getConfigurationElementsFor(GRAPHICAL_VISUALIZATION_SERVICE_ID); for (IConfigurationElement cElement : configurationElements) id2GraphicalVisualizationServiceConfigurationElement.put(cElement.getAttribute("id"), cElement); //Initialize the reasoning service configurationElements = Platform.getExtensionRegistry().getConfigurationElementsFor(REASONING_SERVICE_ID); for (IConfigurationElement cElement : configurationElements) id2ReasoningServiceConfigurationElement.put(cElement.getAttribute("id"), cElement); //Initialize the refactoring service configurationElements = Platform.getExtensionRegistry().getConfigurationElementsFor(EMENDATION_SERVICE_ID); for (IConfigurationElement cElement : configurationElements) id2EmendationServiceConfigurationElement.put(cElement.getAttribute("id"), cElement); //Initialize the proximity indication service configurationElements = Platform.getExtensionRegistry().getConfigurationElementsFor(PROXIMITY_INDICATION_SERVICE_ID); for (IConfigurationElement cElement : configurationElements) id2ProximityIndicationServiceConfigurationElement.put(cElement.getAttribute("id"), cElement); //Initialize the DSL service configurationElements = Platform.getExtensionRegistry().getConfigurationElementsFor(DSL_SERVICE_ID); for (IConfigurationElement cElement : configurationElements) id2DSLServiceConfigurationElement.put(cElement.getAttribute("id"), cElement); //Initialize the proximity indication service configurationElements = Platform.getExtensionRegistry().getConfigurationElementsFor(POPUPBARBUTTON_PROVIDER_ID); for (IConfigurationElement cElement : configurationElements) id2IPopupToolBarProviderConfigurationElement.put(cElement.getAttribute("id"), cElement); } /** * Returns an instance of the Textual Visualization Service. For performance improvements two caches are used. * One to cache the IConfigurationElements and one to cache the visualization service instance. * * @param id ID of the registered extension point * * @return A cached instance of the visualization service * * @throws CoreException */ public ITextualVisualizationService getTextualVisualizationService(String id) throws CoreException{ ITextualVisualizationService transformator = id2TextualVisualizationServiceInstance.get(id); if (transformator == null) { if (id2TextualVisualizationServiceConfigurationElement.get(id) == null){ String message = "Cannot find extension: " + id; StatusManager.getManager().handle(new MelanieWorkbenchStatus(IStatus.ERROR, MelanieWorkbenchStatus.CANNOT_FIND_PLUGIN, message, new Exception(message), Activator.PLUGIN_ID), StatusManager.LOG); return null; } transformator = (ITextualVisualizationService)id2TextualVisualizationServiceConfigurationElement.get(id).createExecutableExtension("class"); id2TextualVisualizationServiceInstance.put(id, transformator); } return transformator; } /** * Returns the active instance of the Textual Visualization Service. For performance improvements two caches are used. * One to cache the IConfigurationElements and one to cache the visualization service instance. * * * @return A cached instance of the visualization service * * @throws CoreException */ public ITextualVisualizationService getActiveTextualVisualizationService() throws CoreException{ IPreferenceStore store = Activator.getDefault().getPreferenceStore(); return getTextualVisualizationService(store.getString(PreferenceConstants.P_ACTIVE_TEXTUAL_VISUALIZATION_ENGINE)); } /** * Returns an instance of the Visualization Service. For performance improvements two caches are used. * One to cache the IConfigurationElements and one to cache the visualization service instance. * * @param id ID of the registered extension point * * @return A cached instance of the visualization service * * @throws CoreException */ public IGraphicalVisualizationService getGraphicalVisualizationService(String id) throws CoreException{ IGraphicalVisualizationService transformator = id2GraphicalVisualizationServiceInstance.get(id); if (transformator == null) { if (id2GraphicalVisualizationServiceConfigurationElement.get(id) == null){ String message = "Cannot find extension: " + id; StatusManager.getManager().handle(new MelanieWorkbenchStatus(IStatus.ERROR, MelanieWorkbenchStatus.CANNOT_FIND_PLUGIN, message, new Exception(message), Activator.PLUGIN_ID), StatusManager.LOG); return null; } transformator = (IGraphicalVisualizationService)id2GraphicalVisualizationServiceConfigurationElement.get(id).createExecutableExtension("class"); id2GraphicalVisualizationServiceInstance.put(id, transformator); } return transformator; } /** * Returns the active instance of the Visualization Service. For performance improvements two caches are used. * One to cache the IConfigurationElements and one to cache the visualization service instance. * * * @return A cached instance of the visualization service * * @throws CoreException */ public IGraphicalVisualizationService getActiveGraphicalVisualizationService() throws CoreException{ IPreferenceStore store = Activator.getDefault().getPreferenceStore(); return getGraphicalVisualizationService(store.getString(PreferenceConstants.P_ACTIVE_GRAPHICAL_VISUALIZATION_ENGINE)); } /** * Returns an instance of the Reasoning Service. For performance improvements two caches are used. * One to cache the IConfigurationElements and one to cache the visualization service instance. * * @param id ID of the registered extension point * * @return A cached instance of the reasoning service * * @throws CoreException */ public IReasoningService getReasoningService(String id) throws CoreException{ IReasoningService reasoner = id2ReasoningServiceInstance.get(id); if (reasoner == null && id2ReasoningServiceConfigurationElement.get(id) != null) { if (id2ReasoningServiceConfigurationElement.get(id) == null){ String message = "Cannot find extension: " + id; StatusManager.getManager().handle(new MelanieWorkbenchStatus(IStatus.ERROR, MelanieWorkbenchStatus.CANNOT_FIND_PLUGIN, message, new Exception(message), Activator.PLUGIN_ID), StatusManager.LOG); return null; } reasoner = (IReasoningService)id2ReasoningServiceConfigurationElement.get(id).createExecutableExtension("class"); id2ReasoningServiceInstance.put(id, reasoner); } return reasoner; } /** * Returns the active Reasoning Service. For performance improvements two caches are used. * One to cache the IConfigurationElements and one to cache the visualization service instance. * * * @return A cached instance of the reasoning service * * @throws CoreException */ public IReasoningService getActiveReasoningService() throws CoreException{ IPreferenceStore store = Activator.getDefault().getPreferenceStore(); IReasoningService reasoner = getReasoningService(store.getString(PreferenceConstants.P_ACTIVE_REASONING_ENGINE)); return reasoner != null ? reasoner.Instance() : null; } /** * Returns an instance of the Refactoring Service. For performance improvements two caches are used. * One to cache the IConfigurationElements and one to cache the visualization service instance. * * @param id ID of the registered extension point * * @return A cached instance of the reasoning service * * @throws CoreException */ public IEmendationService getEmendationService(String id) throws CoreException{ IEmendationService emender = id2EmendationServiceInstance.get(id); if (emender == null) { if (id2EmendationServiceConfigurationElement.get(id) == null){ String message = "Cannot find extension: " + id; StatusManager.getManager().handle(new MelanieWorkbenchStatus(IStatus.ERROR, MelanieWorkbenchStatus.CANNOT_FIND_PLUGIN, message, new Exception(message), Activator.PLUGIN_ID), StatusManager.LOG); return null; } emender = (IEmendationService)id2EmendationServiceConfigurationElement.get(id).createExecutableExtension("class"); id2EmendationServiceInstance.put(id, emender); } return emender; } /** * Returns the active Refactoring Service. For performance improvements two caches are used. * One to cache the IConfigurationElements and one to cache the visualization service instance. * * @param id ID of the registered extension point * * @return A cached instance of the reasoning service * * @throws CoreException */ public IEmendationService getActiveEmendationService() throws CoreException{ IPreferenceStore store = Activator.getDefault().getPreferenceStore(); return getEmendationService(store.getString(PreferenceConstants.P_ACTIVE_EMENDATION_ENGINE)); } /** * Returns an instance of the Proximity Indicarion Service. For performance improvements two caches are used. * One to cache the IConfigurationElements and one to cache the visualization service instance. * * @param id ID of the registered extension point * * @return A cached instance of the reasoning service * * @throws CoreException */ public IProximityIndicationService getProximityIndicationService(String id) throws CoreException{ IProximityIndicationService proximityIndicator = id2ProximityIndicationServiceInstance.get(id); if (proximityIndicator == null) { if (id2ProximityIndicationServiceConfigurationElement.get(id) == null){ String message = "Cannot find extension: " + id; StatusManager.getManager().handle(new MelanieWorkbenchStatus(IStatus.ERROR, MelanieWorkbenchStatus.CANNOT_FIND_PLUGIN, message, new Exception(message), Activator.PLUGIN_ID), StatusManager.LOG); return null; } proximityIndicator = (IProximityIndicationService)id2ProximityIndicationServiceConfigurationElement.get(id).createExecutableExtension("class"); id2ProximityIndicationServiceInstance.put(id, proximityIndicator); } return proximityIndicator; } /** * Returns the active Proximity Indication Service. For performance improvements two caches are used. * One to cache the IConfigurationElements and one to cache the visualization service instance. * * @param id ID of the registered extension point * * @return A cached instance of the reasoning service * * @throws CoreException */ public IProximityIndicationService getActiveProximityIndicationService() throws CoreException{ IPreferenceStore store = Activator.getDefault().getPreferenceStore(); return getProximityIndicationService(store.getString(PreferenceConstants.P_ACTIVE_PROXIMITY_INDICATION_ENGINE)); } /** * Returns an instance of the Proximity Indication Service. For performance improvements two caches are used. * One to cache the IConfigurationElements and one to cache the visualization service instance. * * @param id ID of the registered extension point * * @return A cached instance of the reasoning service * * @throws CoreException */ public IDSLService getDSLService(String id) throws CoreException{ IDSLService dslService = id2DSLServiceInstance.get(id); if (dslService == null) { if (id2DSLServiceConfigurationElement.get(id) == null){ String message = "Cannot find extension: " + id; StatusManager.getManager().handle(new MelanieWorkbenchStatus(IStatus.ERROR, MelanieWorkbenchStatus.CANNOT_FIND_PLUGIN, message, new Exception(message), Activator.PLUGIN_ID), StatusManager.LOG); return null; } dslService = (IDSLService)id2DSLServiceConfigurationElement.get(id).createExecutableExtension("class"); id2DSLServiceInstance.put(id, dslService); } return dslService; } /** * Returns the active Proximity Indication Service. For performance improvements two caches are used. * One to cache the IConfigurationElements and one to cache the visualization service instance. * * @param id ID of the registered extension point * * @return A cached instance of the reasoning service * * @throws CoreException */ public IDSLService getActiveDSLService() throws CoreException{ IPreferenceStore store = Activator.getDefault().getPreferenceStore(); return getDSLService(store.getString(PreferenceConstants.P_ACTIVE_DSL_ENGINE)); } /** * Returns an instance of the PopupBarButtonProvider. For performance improvements two caches are used. * One to cache the IConfigurationElements and one to cache the visualization service instance. * * @param id ID of the registered extension point * * @return A cached instance of the reasoning service * * @throws CoreException */ public IPopupToolBarProvider getPopUpBarButtonProvider(String id) throws CoreException{ IPopupToolBarProvider popupBarToolProvider = id2IPopupToolBarProviderInstance.get(id); if (popupBarToolProvider == null) { if (id2IPopupToolBarProviderConfigurationElement.get(id) == null){ String message = "Cannot find extension: " + id; StatusManager.getManager().handle(new MelanieWorkbenchStatus(IStatus.ERROR, MelanieWorkbenchStatus.CANNOT_FIND_PLUGIN, message, new Exception(message), Activator.PLUGIN_ID), StatusManager.LOG); return null; } popupBarToolProvider = (IPopupToolBarProvider)id2IPopupToolBarProviderConfigurationElement.get(id).createExecutableExtension("class"); id2IPopupToolBarProviderInstance.put(id, popupBarToolProvider); } return popupBarToolProvider; } /** * Returns instances of all PopupBarButtonProvider. For performance improvements two caches are used. * One to cache the IConfigurationElements and one to cache the visualization service instance. * * @param id ID of the registered extension point * * @return A cached instance of the reasoning service * * @throws CoreException */ public List<IPopupToolBarProvider> getAllPopUpBarButtonProvider() throws CoreException{ List<IPopupToolBarProvider> popupBarToolProviders = new ArrayList<IPopupToolBarProvider>(id2IPopupToolBarProviderInstance.keySet().size()); for (String id : id2IPopupToolBarProviderConfigurationElement.keySet()){ popupBarToolProviders.add(getPopUpBarButtonProvider(id)); } return popupBarToolProviders; } }