/******************************************************************************* * 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.colors; import java.util.HashSet; import java.util.List; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import fr.inria.soctrace.framesoc.core.FramesocManager; import fr.inria.soctrace.framesoc.core.bus.FramesocBus; import fr.inria.soctrace.framesoc.core.bus.FramesocBusTopic; import fr.inria.soctrace.framesoc.core.bus.FramesocBusTopicList; import fr.inria.soctrace.framesoc.core.bus.IFramesocBusListener; import fr.inria.soctrace.framesoc.core.tools.management.PluginImporterJob; import fr.inria.soctrace.lib.model.EventProducer; import fr.inria.soctrace.lib.model.EventType; import fr.inria.soctrace.lib.model.Trace; import fr.inria.soctrace.lib.model.utils.SoCTraceException; import fr.inria.soctrace.lib.query.EventProducerQuery; import fr.inria.soctrace.lib.query.EventTypeQuery; import fr.inria.soctrace.lib.query.TraceQuery; import fr.inria.soctrace.lib.storage.DBObject; import fr.inria.soctrace.lib.storage.SystemDBObject; import fr.inria.soctrace.lib.storage.TraceDBObject; /** * Service created at UI startup to update trace colors * when a new trace is imported to the system. * * <p> * The service reacts to the {@link FramesocBus} topic * {@link FramesocBusTopic#TOPIC_UI_COLORS_CHANGED} * initializing the Framesoc colors for the newly * created traces at each trace import performed within a * {@link PluginImporterJob}. * * @author "Generoso Pagano <generoso.pagano@inria.fr>" */ public class FramesocColorService implements IFramesocBusListener { private final static Logger logger = LoggerFactory.getLogger(FramesocColorService.class); /** * List containing all SystemDB traces at a given time. */ private Set<Trace> traces; /** * List of followed topics */ private FramesocBusTopicList topics; /** * Constructor. * Initializes the service, loading the existing trace metadata. */ public FramesocColorService() { // register to the topic related to the import of a new trace topics = new FramesocBusTopicList(this); topics.addTopic(FramesocBusTopic.TOPIC_UI_SYNCH_TRACES_NEEDED); topics.registerAll(); // load the traces, if a SystemDB exists traces = new HashSet<Trace>(); SystemDBObject sysDB = null; try { if (!FramesocManager.getInstance().isSystemDBExisting()) return; sysDB = SystemDBObject.openNewInstance(); TraceQuery tq = new TraceQuery(sysDB); List<Trace> tmp = tq.getList(); for (Trace t: tmp) { traces.add(t); } } catch (SoCTraceException e) { logger.error(e.getMessage()); e.printStackTrace(); } finally { DBObject.finalClose(sysDB); } } @Override public void handle(FramesocBusTopic topic, Object data) { if (topic.equals(FramesocBusTopic.TOPIC_UI_SYNCH_TRACES_NEEDED)) { if ( ((Boolean) data ) == true ) { try { updateColors(); } catch (SoCTraceException e) { logger.error(e.getMessage()); e.printStackTrace(); } } } } private void updateColors() throws SoCTraceException { if (!FramesocManager.getInstance().isSystemDBExisting()) return; SystemDBObject sysDB= null; try { sysDB = SystemDBObject.openNewInstance(); TraceQuery tq = new TraceQuery(sysDB); List<Trace> tmp = tq.getList(); sysDB.close(); for (Trace t: tmp) { if (!traces.contains(t)) { logger.debug("Update colors for trace: {}", t.getAlias()); traces.add(t); updateTraceColors(t); } } } finally { DBObject.finalClose(sysDB); } } private void updateTraceColors(Trace t) throws SoCTraceException { if (!FramesocManager.getInstance().isDBExisting(t.getDbName())) return; TraceDBObject traceDB = null; try { traceDB = TraceDBObject.openNewInstance(t.getDbName()); EventTypeQuery etq = new EventTypeQuery(traceDB); List<EventType> types = etq.getList(); for (EventType et: types) { FramesocColorManager.getInstance().getEventTypeColor(et.getName()); } FramesocColorManager.getInstance().saveEventTypeColors(); EventProducerQuery epq = new EventProducerQuery(traceDB); List<EventProducer> eps = epq.getList(); for (EventProducer ep: eps) { FramesocColorManager.getInstance().getEventProducerColor(ep.getName()); } FramesocColorManager.getInstance().saveEventProducerColors(); } finally { DBObject.finalClose(traceDB); } } }