blob: 7a2f7de9d945b4545f4a6f8f6c1fafb80c513f8d [file] [log] [blame]
/**
* Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-v2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Thales Corporate Services S.A.S - initial API and implementation
*/
package org.eclipse.egf.core.platform;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.egf.common.activator.EGFAbstractPlugin;
import org.eclipse.egf.common.l10n.EGFCommonMessages;
import org.eclipse.egf.core.platform.internal.pde.EgfPlatformManager;
import org.eclipse.egf.core.platform.internal.pde.IManagerConstants;
import org.eclipse.egf.core.platform.pde.IPlatformBundle;
import org.eclipse.egf.core.platform.pde.IPlatformExtensionPoint;
import org.eclipse.egf.core.platform.pde.IPlatformExtensionPointFactory;
import org.eclipse.egf.core.platform.pde.IPlatformManager;
import org.eclipse.egf.core.platform.uri.EgfURIConverter;
import org.eclipse.osgi.util.NLS;
import org.osgi.framework.BundleContext;
/**
* @author Xavier Maysonnave
*
*/
public class EGFPlatformPlugin extends EGFAbstractPlugin {
private static EGFPlatformPlugin __plugin;
private IPlatformManager platformManager;
private EgfURIConverter uriConverter;
private static Map<String, IConfigurationElement> __managerExtensionPoints;
private static Map<String, Class<? extends IPlatformExtensionPoint>> __platformExtensionPoints;
private static Collection<Class<? extends IPlatformExtensionPoint>> __platformExtensionPointClasses;
private static Map<Class<? extends IPlatformExtensionPoint>, IPlatformExtensionPointFactory<? extends IPlatformExtensionPoint>> __platformExtensionPointFactories;
/**
* Returns the shared instance
*
* @return the shared instance
*/
public static EGFPlatformPlugin getDefault() {
return __plugin;
}
public static IPlatformManager getPlatformManager() {
return getDefault().platformManager;
}
/**
* Returns a snapshot of known IPlatformFcore
*
* @return an array of IPlatformFcore
*/
public static EgfURIConverter getPlatformURIConverter() {
return getDefault().uriConverter;
}
/**
* Get __managerExtensionPoints.
*
* @return an empty map if none could be found.
*/
public Map<String, IConfigurationElement> getManagerExtensionPoints() {
// Lazy loading.
if (__managerExtensionPoints == null) {
// Build managers map
Map<String, IConfigurationElement> platformManagers = new HashMap<String, IConfigurationElement>();
Map<String, Class<? extends IPlatformExtensionPoint>> interfaces = new HashMap<String, Class<? extends IPlatformExtensionPoint>>();
IConfigurationElement[] elements = Platform.getExtensionRegistry().getConfigurationElementsFor(getDefault().getBundle().getSymbolicName(), IManagerConstants.MANAGER_EXTENSION_POINT_ID);
// Get EGF Platform extension points.
for (IConfigurationElement element : elements) {
// Extension retrieval
String extension = element.getAttribute(IManagerConstants.MANAGER_ATT_EXTENSION);
// Ignore
if (extension == null || extension.trim().length() == 0) {
continue;
}
extension = extension.trim();
// Check
if (platformManagers.containsKey(extension)) {
getDefault().logError(NLS.bind(EGFCommonMessages.Duplicate_Element_Message, extension));
getDefault().logInfo(NLS.bind(EGFCommonMessages.Bundle_Message, element.getContributor().getName()), 1);
getDefault().logInfo(NLS.bind(EGFCommonMessages.Extension_Point_Message, element.getName()), 1);
continue;
}
// Time to init Factory
long startTimeFactory = System.currentTimeMillis();
// Check factory
Object factory = null;
try {
factory = element.createExecutableExtension(IManagerConstants.MANAGER_ATT_CLASS);
} catch (Throwable t) {
getDefault().logError(t);
}
if (EGFPlatformPlugin.getDefault().isDebugging()) {
long endTime = System.currentTimeMillis();
long time = (endTime - startTimeFactory);
EGFPlatformPlugin.getDefault().logInfo(NLS.bind("EGFPlatformPlugin _ create factory ''{0}'' in ''{1}'' ms", //$NON-NLS-1$
element.getAttribute(IManagerConstants.MANAGER_ATT_EXTENSION), time));
}
if (factory == null) {
continue;
}
if (factory instanceof IPlatformExtensionPointFactory<?> == false) {
getDefault().logError(NLS.bind(EGFCommonMessages.Wrong_Class_Message, factory.getClass().getName()));
getDefault().logInfo(NLS.bind(EGFCommonMessages.Wrong_Class_Sub_Type_Message, IPlatformExtensionPointFactory.class.getName()), 1);
getDefault().logInfo(NLS.bind(EGFCommonMessages.Bundle_Message, element.getContributor().getName()), 1);
getDefault().logInfo(NLS.bind(EGFCommonMessages.Extension_Point_Message, element.getName()), 1);
getDefault().logInfo(NLS.bind(EGFCommonMessages.Attribute_Message, extension), 1);
continue;
}
// Fetch Returned Types from Class
Class<? extends IPlatformExtensionPoint> clazz = fetchReturnedTypeFromFactory(factory.getClass());
if (clazz == null) {
getDefault().logError(NLS.bind(EGFCommonMessages.Wrong_Class_Message, factory.getClass().getName()));
getDefault().logInfo("Unable to find ''createExtensionPoint(IPlatformBundle platformBundle, Object object)'' method."); //$NON-NLS-1$
getDefault().logInfo(NLS.bind(EGFCommonMessages.Bundle_Message, element.getContributor().getName()), 1);
getDefault().logInfo(NLS.bind(EGFCommonMessages.Extension_Point_Message, element.getName()), 1);
continue;
}
if (interfaces.get(factory.getClass().getName()) != null) {
getDefault().logError(NLS.bind(EGFCommonMessages.Duplicate_Element_Message, factory.getClass().getName()));
getDefault().logInfo(NLS.bind(EGFCommonMessages.Bundle_Message, element.getContributor().getName()), 1);
getDefault().logInfo(NLS.bind(EGFCommonMessages.Extension_Point_Message, element.getName()), 1);
continue;
}
// Register
platformManagers.put(extension, element);
interfaces.put(factory.getClass().getName(), clazz);
}
// Assign static map
__managerExtensionPoints = platformManagers;
}
return __managerExtensionPoints;
}
@SuppressWarnings("unchecked")
public static Map<String, Class<? extends IPlatformExtensionPoint>> getPlatformExtensionPoints() {
if (__platformExtensionPoints == null) {
Map<String, IConfigurationElement> platformManagers = getDefault().getManagerExtensionPoints();
Map<String, Class<? extends IPlatformExtensionPoint>> extensionPoints = new HashMap<String, Class<? extends IPlatformExtensionPoint>>();
for (Map.Entry<String, IConfigurationElement> entry : platformManagers.entrySet()) {
// Factory
IPlatformExtensionPointFactory<?> clazz = null;
try {
clazz = (IPlatformExtensionPointFactory<?>) entry.getValue().createExecutableExtension(IManagerConstants.MANAGER_ATT_CLASS);
} catch (CoreException ce) {
EGFPlatformPlugin.getDefault().logError(ce);
}
if (clazz == null) {
continue;
}
// Fetch Returned Types from Factory
Class<?> key = EGFPlatformPlugin.fetchReturnedTypeFromFactory(((IPlatformExtensionPointFactory<?>) clazz).getClass());
// Store it
extensionPoints.put(entry.getKey(), (Class<? extends IPlatformExtensionPoint>) key);
}
__platformExtensionPoints = extensionPoints;
}
return __platformExtensionPoints;
}
public static Collection<Class<? extends IPlatformExtensionPoint>> getPlatformExtensionPointClasses() {
if (__platformExtensionPointClasses == null) {
__platformExtensionPointClasses = getPlatformExtensionPoints().values();
}
return __platformExtensionPointClasses;
}
@SuppressWarnings("unchecked")
public static Map<Class<? extends IPlatformExtensionPoint>, IPlatformExtensionPointFactory<? extends IPlatformExtensionPoint>> getPlatformExtensionPointFactories() {
if (__platformExtensionPointFactories == null) {
Map<String, IConfigurationElement> platformManagers = EGFPlatformPlugin.getDefault().getManagerExtensionPoints();
Map<Class<? extends IPlatformExtensionPoint>, IPlatformExtensionPointFactory<? extends IPlatformExtensionPoint>> extensionPointFactories = new HashMap<Class<? extends IPlatformExtensionPoint>, IPlatformExtensionPointFactory<? extends IPlatformExtensionPoint>>();
for (Map.Entry<String, IConfigurationElement> entry : platformManagers.entrySet()) {
// Factory
IPlatformExtensionPointFactory<?> clazz = null;
try {
clazz = (IPlatformExtensionPointFactory<?>) entry.getValue().createExecutableExtension(IManagerConstants.MANAGER_ATT_CLASS);
} catch (CoreException ce) {
EGFPlatformPlugin.getDefault().logError(ce);
}
if (clazz == null) {
continue;
}
// Fetch Returned Types from Factory
Class<?> key = EGFPlatformPlugin.fetchReturnedTypeFromFactory(((IPlatformExtensionPointFactory<?>) clazz).getClass());
// Store it
extensionPointFactories.put((Class<? extends IPlatformExtensionPoint>) key, (IPlatformExtensionPointFactory<?>) clazz);
}
__platformExtensionPointFactories = extensionPointFactories;
}
return __platformExtensionPointFactories;
}
@SuppressWarnings("unchecked")
public static Class<? extends IPlatformExtensionPoint> fetchReturnedTypeFromFactory(Class<?> factory) {
Method method = null;
try {
method = factory.getDeclaredMethod("createExtensionPoint", IPlatformBundle.class, Object.class); //$NON-NLS-1$
} catch (NoSuchMethodException nsme) {
getDefault().logError(nsme);
}
if (method == null) {
return null;
}
Type type = null;
try {
type = method.getGenericReturnType();
} catch (Throwable t) {
getDefault().logError(t);
}
if (type == null) {
return null;
}
try {
return (Class<? extends IPlatformExtensionPoint>) type;
} catch (ClassCastException cce) {
getDefault().logError(cce);
}
return null;
}
/**
* The constructor
*/
public EGFPlatformPlugin() {
super();
}
/**
*
* org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.
* BundleContext)
*/
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
__plugin = this;
uriConverter = new EgfURIConverter();
platformManager = new EgfPlatformManager();
}
/**
* org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.
* BundleContext)
*/
@Override
public void stop(BundleContext context) throws Exception {
platformManager.dispose();
platformManager = null;
uriConverter = null;
__managerExtensionPoints = null;
__platformExtensionPoints = null;
__platformExtensionPointClasses = null;
__platformExtensionPointFactories = null;
super.stop(context);
__plugin = null;
}
}