blob: d7de96cc3e859092ee36a0030091622a289437c7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2007 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal.intro.impl.model.loader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.ui.internal.intro.impl.model.AbstractIntroIdElement;
import org.eclipse.ui.internal.intro.impl.model.IntroModelRoot;
import org.eclipse.ui.internal.intro.impl.util.Log;
import org.eclipse.ui.internal.intro.impl.util.Util;
/**
* Base class for handling Intro Extensions.
*/
public class BaseExtensionPointManager {
// the config extension id
protected static final String CONFIG = "org.eclipse.ui.intro.config"; //$NON-NLS-1$
// the configExtension extension id
protected static final String CONFIG_EXTENSION = "org.eclipse.ui.intro.configExtension"; //$NON-NLS-1$
// the attribute in the config element to specify the intro part id.
protected static final String ATT_CONFIG_INTRO_ID = "introId"; //$NON-NLS-1$
// the attribute in the config element to specify the intro part id.
protected static final String ATT_CONFIG_EXTENSION_CONFIG_ID = "configId"; //$NON-NLS-1$
// the id attribute in any intro element.
protected static final String ATT_ID = AbstractIntroIdElement.ATT_ID;
protected Map<String, IntroModelRoot> introModels = new HashMap<>();
protected IExtensionRegistry registry;
protected SharedConfigExtensionsManager sharedConfigExtensionsManager;
private String extensionFilter;
/*
* Prevent creation.
*/
protected BaseExtensionPointManager() {
registry = Platform.getExtensionRegistry();
}
protected IntroModelRoot loadModel(String attributeName,
String attributeValue) {
long start = 0;
if (Log.logPerformance)
start = System.currentTimeMillis();
// get all Config extension point contributions. There could be more
// than one config contribution, but there should only be one that maps
// to the cached intro part id.
IConfigurationElement introConfig = getIntroConfig(attributeName,
attributeValue);
// load model with the config elements of the correct contribution. If
// there are no valid contribution, model stays null.
if (introConfig != null) {
// we found matching config. Get all configExtension contributed to
// this config and pass to model. Load generic config extensions as
// well.
String configId = introConfig.getAttribute(ATT_ID);
IConfigurationElement[] introConfigExtensions = null;
if (configId == null)
// if id of config is null, pass empty array.
introConfigExtensions = new IConfigurationElement[0];
else
introConfigExtensions = getIntroConfigExtensions(
ATT_CONFIG_EXTENSION_CONFIG_ID, configId);
if (Log.logPerformance)
Util.logPerformanceTime(
"BEGIN: quering registry for configs took: ", start); //$NON-NLS-1$
IntroModelRoot model = new IntroModelRoot(introConfig,
introConfigExtensions);
model.loadModel();
// add the current model to the hash table of models, only if it is
// not null. They key is the model id, which is the id of the
// config that defined this model.
addCachedModel(model.getId(), model);
// now load all generic config extension. ie: standbyPart and
// command contributions.
loadSharedConfigExtensions();
if (Log.logPerformance)
Util
.logPerformanceTime(
"loading Intro Model (quering registry/creating & resolving model) took: ", //$NON-NLS-1$
start);
return model;
}
return null;
}
/**
* Go through all the config elements and only return the correct config
* that maps to the correct intro part id. If there is more than one config
* thats maps to the same intro part id, log the fact, and return the first
* one. If there are non, return null.
*
* @param configElements
* @return
*/
protected IConfigurationElement getIntroConfig(String attrributeName,
String attributeValue) {
IConfigurationElement[] configElements = registry
.getConfigurationElementsFor(CONFIG);
IConfigurationElement config = getConfigurationFromAttribute(
configElements, attrributeName, attributeValue);
if (config == null)
// if there is no valid config, log the fact.
Log.warning("No Intro configuration found with " + attrributeName //$NON-NLS-1$
+ " of value = " + attributeValue); //$NON-NLS-1$
return config;
}
/**
* Go through all the configExtension elements and return an array of all
* extensions that match the attribute and its value. If there are non,
* return empty array. This also loads all standby contributions.
*/
protected IConfigurationElement[] getIntroConfigExtensions(
String attrributeName, String attributeValue) {
IConfigurationElement[] configExtensionElements = registry
.getConfigurationElementsFor(CONFIG_EXTENSION);
/*
* Extension filter is used for performance testing to only load contributions
* from a specific plug-in (fixed data set).
*/
if (extensionFilter != null) {
List<IConfigurationElement> filtered = new ArrayList<>();
for (int i=0;i<configExtensionElements.length;++i) {
if (extensionFilter.equals(configExtensionElements[i].getContributor().getName())) {
filtered.add(configExtensionElements[i]);
}
}
configExtensionElements = (IConfigurationElement[])filtered.toArray(new IConfigurationElement[filtered.size()]);
}
IConfigurationElement[] configExtensions = getConfigurationsFromAttribute(
configExtensionElements, attrributeName, attributeValue);
return configExtensions;
}
/**
* Add a model to the cache. This method is private because only this
* manager class knows how to load an intro model.
*
* @param modelId
* @param model
*/
protected void addCachedModel(String modelId, IntroModelRoot model) {
introModels.put(modelId, model);
}
/**
* Gets the given model from the cache.
*
* @param modelId
*/
protected IntroModelRoot getCachedModel(String configId) {
return (IntroModelRoot) introModels.get(configId);
}
/**
* Go through all the config elements and only return the correct config
* with an attribute of the given value. If there is more than one
* configuration element that maps to the attribute value log the fact, and
* return the first one. If there are non, return null.
*
* @param configElements
* @return
*/
protected IConfigurationElement getConfigurationFromAttribute(
IConfigurationElement[] configElements, String attributeName,
String attributeValue) {
// find all configs with given attribute and attibute value.
IConfigurationElement[] filteredConfigElements = getConfigurationsFromAttribute(
configElements, attributeName, attributeValue);
// now validate that we got only one.
IConfigurationElement config = ModelLoaderUtil
.validateSingleContribution(filteredConfigElements, attributeName);
return config;
}
/**
* Go through all the config elements and return an array of matching
* configs with an attribute of the given value. If there are non, return
* empty array.
*/
protected IConfigurationElement[] getConfigurationsFromAttribute(
IConfigurationElement[] configElements, String attributeName,
String attributeValue) {
// find all configs with given attribute and attibute value.
Vector<IConfigurationElement> elements = new Vector<>();
for (int i = 0; i < configElements.length; i++) {
String currentAttributeValue = configElements[i]
.getAttribute(attributeName);
if (currentAttributeValue != null
&& currentAttributeValue.equals(attributeValue))
elements.add(configElements[i]);
}
// now return array.
IConfigurationElement[] filteredConfigElements = new IConfigurationElement[elements
.size()];
elements.copyInto(filteredConfigElements);
return filteredConfigElements;
}
/**
* Loads all shared config extennsions (ie: standby parts and commands).
*/
protected void loadSharedConfigExtensions() {
sharedConfigExtensionsManager = new SharedConfigExtensionsManager(
registry);
sharedConfigExtensionsManager.loadSharedConfigExtensions();
}
/**
* @return Returns the sharedConfigExtensionsManager.
*/
public SharedConfigExtensionsManager getSharedConfigExtensionsManager() {
return sharedConfigExtensionsManager;
}
/**
* @return Returns the cached introModels.
*/
public Map<String, IntroModelRoot> getIntroModels() {
return introModels;
}
/*
* Internal test hook for restricting which extensions to load.
*/
public void setExtensionFilter(String pluginId) {
extensionFilter = pluginId;
}
}