/******************************************************************************* * 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.core.tools.importers; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import fr.inria.soctrace.lib.model.Trace; import fr.inria.soctrace.lib.model.TraceParam; import fr.inria.soctrace.lib.model.TraceParamType; import fr.inria.soctrace.lib.model.TraceType; import fr.inria.soctrace.lib.model.utils.SoCTraceException; import fr.inria.soctrace.lib.storage.SystemDBObject; import fr.inria.soctrace.lib.storage.utils.SQLConstants.FramesocTable; import fr.inria.soctrace.lib.utils.IdManager; /** * Abstract class to manage Trace metadata. * * <p> * Normally subclasses have simply to override the methods * {@link TraceMetadataManager#setTraceFields(Trace)} and * {@link TraceMetadataManager#getTraceTypeName()} of {@link TraceMetadataManager} interface. * * <p> * Typical usage: * * <pre> * Trace t = new Trace(sysDB.getNewId(FramesocTable.TRACE.toString(), "ID")); * meta.setTraceFields(t); * meta.createMetadata(); * meta.saveMetadata(); * </pre> * * <p> * Note that this class internally uses System DB methods to get unique IDs. It is the user's * responsibility to ensure that, when {@link #createMetadata()} is called, the System DB contains * updated (committed) information about any other trace, trace type, trace parameter or trace * parameter type. * * @author "Generoso Pagano <generoso.pagano@inria.fr>" */ public abstract class AbstractTraceMetadataManager implements TraceMetadataManager { private SystemDBObject sysDB; private TraceType traceType; private Trace trace; private Map<String, TraceParamType> tptMap; /** * Constructor. * * @param sysDB * System DB object * @throws SoCTraceException */ public AbstractTraceMetadataManager(SystemDBObject sysDB) throws SoCTraceException { this.sysDB = sysDB; this.tptMap = new HashMap<String, TraceParamType>(); } @Override public List<ParameterDescriptor> getParameterDescriptors() { return new LinkedList<>(); } @Override public void createMetadata() throws SoCTraceException { // Trace Type buildTraceType(); // Trace buildTrace(); } @Override public void saveMetadata() throws SoCTraceException { if (!isTraceTypeExisting()) { sysDB.save(traceType); for (TraceParamType tpt : traceType.getTraceParamTypes()) { sysDB.save(tpt); } } sysDB.save(trace); for (TraceParam tp : trace.getParams()) { sysDB.save(tp); } } private void buildTraceType() throws SoCTraceException { if (isTraceTypeExisting()) { traceType = sysDB.getTraceType(getTraceTypeName()); for (TraceParamType tpt : traceType.getTraceParamTypes()) { tptMap.put(tpt.getName(), tpt); } } else { traceType = new TraceType(sysDB.getNewId(FramesocTable.TRACE_TYPE.toString(), "ID")); traceType.setName(getTraceTypeName()); List<ParameterDescriptor> descriptors = getParameterDescriptors(); if (descriptors.isEmpty()) return; IdManager tptIdManager = new IdManager(); tptIdManager .setNextId(sysDB.getMaxId(FramesocTable.TRACE_PARAM_TYPE.toString(), "ID") + 1); TraceParamType tpt; for (ParameterDescriptor p : descriptors) { tpt = new TraceParamType(tptIdManager.getNextId()); tpt.setTraceType(traceType); tpt.setName(p.getName()); tpt.setType(p.getType()); tptMap.put(p.toString(), tpt); } } } /** * Builds the Trace object * * @throws SoCTraceException */ private void buildTrace() throws SoCTraceException { trace = new Trace(sysDB.getNewId(FramesocTable.TRACE.toString(), "ID")); trace.setType(traceType); setTraceFields(trace); List<ParameterDescriptor> descriptors = getParameterDescriptors(); if (descriptors.isEmpty()) return; IdManager tpIdManager = new IdManager(); tpIdManager.setNextId(sysDB.getMaxId(FramesocTable.TRACE_PARAM.toString(), "ID") + 1); TraceParam tp; for (ParameterDescriptor des : descriptors) { tp = new TraceParam(tpIdManager.getNextId()); tp.setTrace(trace); tp.setTraceParamType(tptMap.get(des.getName())); tp.setValue(des.getValue()); } } /** * Check if the trace type is already in the DB * * @return true, if the trace type is already in the DB, false otherwise. * @throws SoCTraceException */ private boolean isTraceTypeExisting() throws SoCTraceException { return sysDB.isTraceTypePresent(getTraceTypeName()); } }