blob: e3a879ec9c7cda09dbb0175d7c26d29256790b9c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.tracecompass.incubator.internal.traceevent.core.analysis.objectlife;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.incubator.internal.traceevent.core.event.ITraceEventConstants;
import org.eclipse.tracecompass.incubator.internal.traceevent.core.event.TraceEventAspects;
import org.eclipse.tracecompass.incubator.internal.traceevent.core.event.TraceEventPhases;
import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
import org.eclipse.tracecompass.statesystem.core.ITmfStateSystemBuilder;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
import org.eclipse.tracecompass.tmf.core.statesystem.AbstractTmfStateProvider;
import org.eclipse.tracecompass.tmf.core.statesystem.ITmfStateProvider;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
/**
* Object life state provider
*
* @author Matthew Khouzam
*
*/
public class ObjectLifeStateProvider extends AbstractTmfStateProvider {
/**
* Constructor
*
* @param trace
* the trace to follow
*/
public ObjectLifeStateProvider(@NonNull ITmfTrace trace) {
super(trace, ObjectLifeAnalysis.ID);
}
@Override
public int getVersion() {
return 1;
}
@Override
public @NonNull ITmfStateProvider getNewInstance() {
return new ObjectLifeStateProvider(getTrace());
}
@Override
protected void eventHandle(@NonNull ITmfEvent event) {
ITmfStateSystemBuilder ss = getStateSystemBuilder();
if (ss == null) {
return;
}
String phase = event.getContent().getFieldValue(String.class, ITraceEventConstants.PHASE);
if (phase == null) {
return;
}
long t = event.getTimestamp().toNanos();
int quark = ITmfStateSystem.INVALID_ATTRIBUTE;
Object id = TmfTraceUtils.resolveEventAspectOfClassForEvent(event.getTrace(), TraceEventAspects.ID_ASPECT.getClass(), event);
String name = String.valueOf(TmfTraceUtils.resolveAspectOfNameForEvent(event.getTrace(), "Name", event)); //$NON-NLS-1$
if (id == null) {
return;
}
switch (phase) {
case TraceEventPhases.OBJECT_CREATED:
quark = ss.getQuarkAbsoluteAndAdd(name, String.valueOf(id));
ss.modifyAttribute(t, "", quark); //$NON-NLS-1$
break;
case TraceEventPhases.OBJECT_SNAPSHOT:
quark = ss.getQuarkAbsoluteAndAdd(name, String.valueOf(id));
ss.modifyAttribute(t, String.valueOf(TraceEventAspects.ARGS_ASPECT.resolve(event)), quark);
break;
case TraceEventPhases.OBJECT_DESTROYED:
quark = ss.getQuarkAbsoluteAndAdd(name, String.valueOf(id));
ss.modifyAttribute(t, (Object)null, quark);
break;
default:
break;
}
}
}