/*******************************************************************************
* 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.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fr.inria.soctrace.lib.model.Event;
import fr.inria.soctrace.lib.model.EventProducer;
import fr.inria.soctrace.lib.model.Trace;
import fr.inria.soctrace.lib.model.utils.ModelConstants.EventCategory;
import fr.inria.soctrace.lib.model.utils.SoCTraceException;
import fr.inria.soctrace.lib.query.EventProducerQuery;
import fr.inria.soctrace.lib.query.EventQuery;
import fr.inria.soctrace.lib.storage.DBObject;
import fr.inria.soctrace.lib.storage.TraceDBObject;
import fr.inria.soctrace.lib.utils.DeltaManager;
/**
* Event loader supporting the Paje algorithm for gantt data structure management.
*
* @author "Generoso Pagano <generoso.pagano@inria.fr>"
*/
public class TimeSliceEntityLoader {
/**
* Logger
*/
private static Logger logger = LoggerFactory.getLogger(TimeSliceEntityLoader.class);
protected Trace trace;
private Map<Integer, EventProducer> eps = new HashMap<Integer, EventProducer>();
private PunctualEvents events = new PunctualEvents();
private TimeSlices states = new TimeSlices();
private TimeSlices links = new TimeSlices();
// TODO Variables
// private Variables variables = new Variables();
public void setTrace(Trace trace) {
this.trace = trace;
}
public void loadTrace() throws SoCTraceException {
logger.debug("loading trace...");
eps.clear();
events.clear();
links.clear();
states.clear();
DeltaManager dm = new DeltaManager();
dm.start();
TraceDBObject traceDB = null;
try {
traceDB = TraceDBObject.openNewInstance(trace.getDbName());
EventProducerQuery epq = new EventProducerQuery(traceDB);
List<EventProducer> epl = epq.getList();
for (EventProducer ep: epl) {
eps.put(ep.getId(), ep);
}
EventQuery query = new EventQuery(traceDB);
query.setLoadParameters(false);
List<Event> elist = query.getList();
long min = traceDB.getMinTimestamp();
long max = traceDB.getMaxTimestamp();
int eNum = trace.getNumberOfEvents();
int slices = Math.max(eNum/30, 1) + 1; // 30 has been taken from Benhur's thesis
long sliceSize = Math.max((max-min)/slices, 1);
logger.debug("Min timestamp {}", min);
logger.debug("Max timestamp {}", max);
logger.debug("Event number {}", eNum);
logger.debug("Number of slices {}", slices);
logger.debug("Slice size {}", sliceSize);
for (int i=0; i<slices; i++) {
states.addTimeSlice(new TimeSlice(min + i*sliceSize));
links.addTimeSlice(new TimeSlice(min + i*sliceSize));
}
for (Event e: elist) {
logger.info(e.toString());
switch(e.getCategory()) {
case EventCategory.PUNCTUAL_EVENT:
events.addEvent(e);
break;
case EventCategory.LINK:
links.addEvent(e);
break;
case EventCategory.STATE:
states.addEvent(e);
break;
case EventCategory.VARIABLE:
break; // ignored now
default:
break; // ignored now
}
}
} finally {
DBObject.finalClose(traceDB);
}
logger.debug("States: {}", states.size());
logger.debug("Links: {}", links.size());
logger.debug("Events: {}", events.size());
logger.debug(dm.endMessage("loading all trace in structures"));
}
public List<Event> loadPage(int minPage) throws SoCTraceException {
throw new SoCTraceException("NOT IMPLEMENTED");
}
public PunctualEvents getPunctualEvents() {
return events;
}
public TimeSlices getStates() {
return states;
}
public TimeSlices getLinks() {
return links;
}
// encapsulate in class Producers
public Map<Integer, EventProducer> getProducers() {
return eps;
}
}