/******************************************************************************* * Copyright (c) 2012-2015 INRIA. * 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: * Generoso Pagano - initial API and implementation ******************************************************************************/ package fr.inria.soctrace.framesoc.ui.gantt; 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.IExtensionRegistry; import org.eclipse.core.runtime.Platform; import fr.inria.soctrace.framesoc.ui.gantt.loaders.EventLoader; import fr.inria.soctrace.framesoc.ui.gantt.loaders.NoCpuEventDrawer; import fr.inria.soctrace.framesoc.ui.gantt.model.IEventDrawer; import fr.inria.soctrace.framesoc.ui.gantt.model.IEventLoader; import fr.inria.soctrace.lib.model.IModelElement; import fr.inria.soctrace.lib.model.TraceType; import fr.inria.soctrace.lib.model.utils.SoCTraceException; import fr.inria.soctrace.lib.storage.DBObject; import fr.inria.soctrace.lib.storage.SystemDBObject; /** * Manager class for Framesoc gantt contribution. * * @author "Generoso Pagano <generoso.pagano@inria.fr>" */ public class GanttContributionManager { // Constants private static final String POINT_ID = "fr.inria.soctrace.framesoc.ui.gantt.adapter"; //$NON-NLS-1$ private static final String TRACE_TYPE_NAME = "traceTypeName"; //$NON-NLS-1$ private static final String EVENT_LOADER = "eventLoader"; //$NON-NLS-1$ private static final String EVENT_DRAWER = "eventDrawer"; //$NON-NLS-1$ private static Map<Integer, IConfigurationElement> extensions = new HashMap<Integer, IConfigurationElement>(); static { SystemDBObject sysDB = null; try { // get trace types sysDB = SystemDBObject.openNewInstance(); Map<Integer, IModelElement> types = sysDB.getTraceTypeCache().getElementMap( TraceType.class); Map<String, Integer> name2id = new HashMap<String, Integer>(); for (IModelElement element : types.values()) { TraceType type = (TraceType) element; name2id.put(type.getName(), type.getId()); } sysDB.close(); // link extensions to type id IExtensionRegistry reg = Platform.getExtensionRegistry(); IConfigurationElement[] config = reg.getConfigurationElementsFor(POINT_ID); for (IConfigurationElement elem : config) { String name = elem.getAttribute(TRACE_TYPE_NAME); extensions.put(name2id.get(name), elem); } } catch (SoCTraceException e1) { e1.printStackTrace(); } finally { DBObject.finalClose(sysDB); } } public static IEventLoader getEventLoader(int typeId) { if (extensions.containsKey(typeId)) { final Object o = getObject(typeId, EVENT_LOADER); if (o instanceof IEventLoader) { return (IEventLoader) o; } } return new EventLoader(); } public static IEventDrawer getEventDrawer(int typeId) { if (extensions.containsKey(typeId)) { final Object o = getObject(typeId, EVENT_DRAWER); if (o instanceof IEventDrawer) { return (IEventDrawer) o; } } return new NoCpuEventDrawer(); } private static Object getObject(int typeId, String field) { try { if (extensions.get(typeId).getAttribute(field) != null) return extensions.get(typeId).createExecutableExtension(field); } catch (CoreException e) { e.printStackTrace(); } return null; } }