6e9345cd4c69bc0f1d292ad187ecdd35769c13ba
[deliverable/tracecompass.git] / lttng / org.eclipse.tracecompass.lttng2.ust.core / src / org / eclipse / tracecompass / lttng2 / ust / core / trace / LttngUstTrace.java
1 /**********************************************************************
2 * Copyright (c) 2013, 2014 Ericsson
3 *
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * Contributors:
10 * Matthew Khouzam - Initial API and implementation
11 * Alexandre Montplaisir - Add UST callstack state system
12 * Marc-Andre Laperle - Handle BufferOverflowException (Bug 420203)
13 **********************************************************************/
14
15 package org.eclipse.tracecompass.lttng2.ust.core.trace;
16
17 import java.util.Collection;
18 import java.util.Map;
19
20 import org.eclipse.core.resources.IProject;
21 import org.eclipse.core.resources.IResource;
22 import org.eclipse.core.runtime.IStatus;
23 import org.eclipse.core.runtime.Status;
24 import org.eclipse.jdt.annotation.NonNull;
25 import org.eclipse.jdt.annotation.Nullable;
26 import org.eclipse.tracecompass.internal.lttng2.ust.core.Activator;
27 import org.eclipse.tracecompass.internal.lttng2.ust.core.trace.layout.LttngUst20EventLayout;
28 import org.eclipse.tracecompass.internal.lttng2.ust.core.trace.layout.LttngUst27EventLayout;
29 import org.eclipse.tracecompass.internal.lttng2.ust.core.trace.layout.LttngUst28EventLayout;
30 import org.eclipse.tracecompass.lttng2.ust.core.analysis.debuginfo.UstDebugInfoBinaryAspect;
31 import org.eclipse.tracecompass.lttng2.ust.core.analysis.debuginfo.UstDebugInfoSourceAspect;
32 import org.eclipse.tracecompass.lttng2.ust.core.trace.layout.ILttngUstEventLayout;
33 import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
34 import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect;
35 import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
36 import org.eclipse.tracecompass.tmf.core.trace.TraceValidationStatus;
37 import org.eclipse.tracecompass.tmf.ctf.core.trace.CtfTmfTrace;
38 import org.eclipse.tracecompass.tmf.ctf.core.trace.CtfTraceValidationStatus;
39 import org.eclipse.tracecompass.tmf.ctf.core.trace.CtfUtils;
40
41 import com.google.common.collect.ImmutableSet;
42
43 /**
44 * Class to contain LTTng-UST traces
45 *
46 * @author Matthew Khouzam
47 */
48 public class LttngUstTrace extends CtfTmfTrace {
49
50 /**
51 * Name of the tracer that generates this trace type, as found in the CTF
52 * metadata.
53 *
54 * @since 2.0
55 */
56 public static final String TRACER_NAME = "lttng-ust"; //$NON-NLS-1$
57
58 private static final int CONFIDENCE = 100;
59
60 private static final @NonNull Collection<ITmfEventAspect> LTTNG_UST_ASPECTS;
61
62 static {
63 ImmutableSet.Builder<ITmfEventAspect> builder = ImmutableSet.builder();
64 builder.addAll(CtfTmfTrace.CTF_ASPECTS);
65 builder.add(UstDebugInfoBinaryAspect.INSTANCE);
66 builder.add(UstDebugInfoSourceAspect.INSTANCE);
67 LTTNG_UST_ASPECTS = builder.build();
68 }
69
70 private @Nullable ILttngUstEventLayout fLayout = null;
71
72 /**
73 * Default constructor
74 */
75 public LttngUstTrace() {
76 super(LttngUstEventFactory.instance());
77 }
78
79 /**
80 * Get the event layout to use with this trace. This normally depends on the
81 * tracer's version.
82 *
83 * @return The event layout
84 * @since 2.0
85 */
86 public @NonNull ILttngUstEventLayout getEventLayout() {
87 ILttngUstEventLayout layout = fLayout;
88 if (layout == null) {
89 throw new IllegalStateException("Cannot get the layout of a non-initialized trace!"); //$NON-NLS-1$
90 }
91 return layout;
92 }
93
94 @Override
95 public void initTrace(IResource resource, String path,
96 Class<? extends ITmfEvent> eventType) throws TmfTraceException {
97 super.initTrace(resource, path, eventType);
98
99 /* Determine the event layout to use from the tracer's version */
100 fLayout = getLayoutFromEnv();
101 }
102
103 private @NonNull ILttngUstEventLayout getLayoutFromEnv() {
104 String tracerName = CtfUtils.getTracerName(this);
105 int tracerMajor = CtfUtils.getTracerMajorVersion(this);
106 int tracerMinor = CtfUtils.getTracerMinorVersion(this);
107
108 if (TRACER_NAME.equals(tracerName)) {
109 if (tracerMajor >= 2) {
110 if (tracerMinor >= 8) {
111 return LttngUst28EventLayout.getInstance();
112 } else if (tracerMinor >= 7) {
113 return LttngUst27EventLayout.getInstance();
114 }
115 return LttngUst20EventLayout.getInstance();
116 }
117 }
118
119 /* Fallback to the UST 2.0 layout and hope for the best */
120 return LttngUst20EventLayout.getInstance();
121 }
122
123 @Override
124 public Iterable<ITmfEventAspect> getEventAspects() {
125 return LTTNG_UST_ASPECTS;
126 }
127
128 /**
129 * {@inheritDoc}
130 * <p>
131 * This implementation sets the confidence to 100 if the trace is a valid
132 * CTF trace in the "ust" domain.
133 */
134 @Override
135 public IStatus validate(final IProject project, final String path) {
136 IStatus status = super.validate(project, path);
137 if (status instanceof CtfTraceValidationStatus) {
138 Map<String, String> environment = ((CtfTraceValidationStatus) status).getEnvironment();
139 /* Make sure the domain is "ust" in the trace's env vars */
140 String domain = environment.get("domain"); //$NON-NLS-1$
141 if (domain == null || !domain.equals("\"ust\"")) { //$NON-NLS-1$
142 return new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.LttngUstTrace_DomainError);
143 }
144 return new TraceValidationStatus(CONFIDENCE, Activator.PLUGIN_ID);
145 }
146 return status;
147 }
148 }
This page took 0.049561 seconds and 4 git commands to generate.