/*******************************************************************************
* Copyright (c) 2013, 2015 Ericsson, EfficiOS Inc. 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
*******************************************************************************/
package org.eclipse.tracecompass.tmf.ctf.core.tests.shared;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.tracecompass.ctf.core.tests.shared.LttngTraceGenerator;
import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace;
import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
import org.eclipse.tracecompass.tmf.ctf.core.event.CtfTmfEvent;
import org.eclipse.tracecompass.tmf.ctf.core.tests.stubs.CtfTmfTraceStub;
import org.eclipse.tracecompass.tmf.ctf.core.trace.CtfTmfTrace;
/**
* Wrapper for the CTF test traces, instantiating {@link CtfTmfTrace} objects
* from them.
*
* @author Alexandre Montplaisir
*/
@NonNullByDefault
public class CtfTmfTestTraceUtils {
private static final Map<CtfTestTrace, CtfTmfTrace> CTF_TMF_TRACES = new HashMap<>();
/**
* Constructor
*/
protected CtfTmfTestTraceUtils() {}
/**
* Return a CtfTmfTraceStub object of this test trace. It will be already
* initTrace()'ed.
*
* After being used by unit tests, traces should be properly disposed by
* calling the {@link #dispose(CtfTestTrace)} method.
*
* @param ctfTrace
* The test trace to initialize
* @return A CtfTmfTrace reference to this trace
*/
public static synchronized CtfTmfTrace getTrace(CtfTestTrace ctfTrace) {
return new CtfTmfTestTraceUtils().internalGetTrace(ctfTrace, CTF_TMF_TRACES, new CtfTmfTraceStub());
}
/**
* Return a CtfTmfTraceStub object of this test trace. It will be already
* initTrace()'ed.
*
* After being used by unit tests, traces should be properly disposed by
* calling the {@link #dispose(CtfTestTrace)} method.
*
* @param ctfTrace
* The test trace to initialize
* @param map
* the trace map
* @param trace
* the trace stub instance
* @return A CtfTmfTrace reference to this trace
*/
protected synchronized CtfTmfTrace internalGetTrace(CtfTestTrace ctfTrace, Map<CtfTestTrace, CtfTmfTrace> map, CtfTmfTrace trace) {
String tracePath;
try {
tracePath = FileLocator.toFileURL(ctfTrace.getTraceURL()).getPath();
} catch (IOException e) {
throw new IllegalStateException();
}
internalDispose(ctfTrace, map);
try {
trace.initTrace(null, tracePath, CtfTmfEvent.class);
} catch (TmfTraceException e) {
/* Should not happen if tracesExist() passed */
throw new RuntimeException(e);
}
map.put(ctfTrace, trace);
return trace;
}
/**
* Dispose of the trace
*
* @param ctfTrace
* Trace to dispose
*/
public static synchronized void dispose(CtfTestTrace ctfTrace) {
new CtfTmfTestTraceUtils().internalDispose(ctfTrace, CTF_TMF_TRACES);
}
/**
* Dispose of the trace
*
* @param ctfTrace
* Trace to dispose
* @param map
* the trace map
*/
protected synchronized void internalDispose(CtfTestTrace ctfTrace, Map<CtfTestTrace, CtfTmfTrace> map) {
CtfTmfTrace trace = map.remove(ctfTrace);
if (trace != null) {
trace.dispose();
}
}
/**
* Get an initialized version of the synthetic trace.
*
* @return A reference to the synthetic trace
*/
public static CtfTmfTrace getSyntheticTrace() {
CtfTmfTrace trace = new CtfTmfTrace();
try {
trace.initTrace(null, LttngTraceGenerator.getPath(), CtfTmfEvent.class);
} catch (TmfTraceException e) {
throw new IllegalStateException();
}
return trace;
}
}