ss: Move plugins to Trace Compass namespace
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.pcap.core / src / org / eclipse / linuxtools / internal / tmf / pcap / core / util / PcapEventFactory.java
CommitLineData
b6eb4dce
VP
1/*******************************************************************************
2 * Copyright (c) 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 * Vincent Perot - Initial API and implementation
11 *******************************************************************************/
12
13package org.eclipse.linuxtools.internal.tmf.pcap.core.util;
14
333a2acb 15import java.nio.file.Path;
b6eb4dce
VP
16import java.util.ArrayList;
17import java.util.HashMap;
18import java.util.List;
19import java.util.Map;
20
21import org.eclipse.jdt.annotation.NonNull;
22import org.eclipse.jdt.annotation.Nullable;
93d1d135 23import org.eclipse.linuxtools.internal.pcap.core.packet.Packet;
c88feda9 24import org.eclipse.linuxtools.internal.pcap.core.protocol.PcapProtocol;
93d1d135
AM
25import org.eclipse.linuxtools.internal.pcap.core.protocol.pcap.PcapPacket;
26import org.eclipse.linuxtools.internal.pcap.core.trace.PcapFile;
27import org.eclipse.linuxtools.internal.pcap.core.util.LinkTypeHelper;
28import org.eclipse.linuxtools.internal.pcap.core.util.PcapTimestampScale;
29import org.eclipse.linuxtools.internal.tmf.pcap.core.event.PcapEvent;
30import org.eclipse.linuxtools.internal.tmf.pcap.core.event.PcapEventField;
31import org.eclipse.linuxtools.internal.tmf.pcap.core.event.PcapEventType;
32import org.eclipse.linuxtools.internal.tmf.pcap.core.event.PcapRootEventField;
33import org.eclipse.linuxtools.internal.tmf.pcap.core.trace.PcapTrace;
b6eb4dce
VP
34import org.eclipse.linuxtools.tmf.core.event.ITmfEventField;
35import org.eclipse.linuxtools.tmf.core.event.TmfEventField;
36import org.eclipse.linuxtools.tmf.core.event.TmfEventType;
37import org.eclipse.linuxtools.tmf.core.timestamp.ITmfTimestamp;
38import org.eclipse.linuxtools.tmf.core.timestamp.TmfTimestamp;
b6eb4dce
VP
39
40/**
41 * Factory class that helps generating Pcap Events.
42 *
43 * @author Vincent Perot
44 */
45public class PcapEventFactory {
46
47 private static final ITmfEventField[] EMPTY_FIELD_ARRAY = new ITmfEventField[0];
48 private static final String EMPTY_STRING = ""; //$NON-NLS-1$
49
c88feda9 50 private static final Map<PcapProtocol, TmfEventType> fEventTypes = new HashMap<>();
b6eb4dce
VP
51
52 private PcapEventFactory() {
53 }
54
55 /**
56 * Method that create a PcapEvent from a packet.
57 *
58 * @param pcapPacket
59 * The packet to generate the event from.
60 * @param pcap
61 * The pcap file to which the packet belongs.
62 * @param trace
63 * The trace to which this packet belongs.
64 * @return The generated PcapEvent.
65 */
66 public static @Nullable PcapEvent createEvent(PcapPacket pcapPacket, PcapFile pcap, PcapTrace trace) {
67 long rank = pcapPacket.getIndex();
68 long timestamp = pcapPacket.getTimestamp();
69 PcapTimestampScale scale = pcapPacket.getTimestampScale();
70 ITmfTimestamp tmfTimestamp;
71 switch (scale) {
72 case MICROSECOND:
6b44794a
MK
73 long us = trace.getTimestampTransform().transform(timestamp * 1000) / 1000;
74 tmfTimestamp = new TmfTimestamp(us, ITmfTimestamp.MICROSECOND_SCALE, (int) pcap.getTimeAccuracy());
b6eb4dce
VP
75 break;
76 case NANOSECOND:
6b44794a
MK
77 long ns = trace.getTimestampTransform().transform(timestamp);
78 tmfTimestamp = new TmfTimestamp(ns, ITmfTimestamp.NANOSECOND_SCALE, (int) pcap.getTimeAccuracy());
b6eb4dce
VP
79 break;
80 default:
81 throw new IllegalArgumentException("The timestamp precision is not valid!"); //$NON-NLS-1$
82 }
333a2acb
AM
83 Path filePath = pcap.getPath().getFileName();
84 @SuppressWarnings("null") // for .toString()
85 @NonNull String fileName = (filePath == null ? EMPTY_STRING : filePath.toString());
86
b6eb4dce
VP
87 String dataLink = Messages.PcapEventFactory_LinkType + ':' + LinkTypeHelper.toString((int) pcapPacket.getPcapFile().getDataLinkType());
88
89 ITmfEventField[] fields = generatePacketFields(pcapPacket);
90 ITmfEventField field = new PcapRootEventField(EMPTY_STRING, fields, pcapPacket);
91 Packet packet = pcapPacket.getMostEcapsulatedPacket();
92 if (!fEventTypes.containsKey(packet.getProtocol())) {
93 String typeIdString = PcapEventType.DEFAULT_PCAP_TYPE_ID + ':' + packet.getProtocol().getShortName();
94 fEventTypes.put(packet.getProtocol(), new PcapEventType(typeIdString, null));
95 }
96 TmfEventType eventType = fEventTypes.get(packet.getProtocol());
97 if (eventType == null) {
98 eventType = new TmfEventType();
99 }
100 return new PcapEvent(trace, rank, tmfTimestamp, dataLink, eventType, field, fileName, packet);
101
102 }
103
104 private static ITmfEventField[] generatePacketFields(Packet packet) {
105 // TODO This is SOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO slow. Must find a
106 // way to use less intermediate data structures.
107 List<ITmfEventField> fieldList = new ArrayList<>();
108 List<ITmfEventField> subfieldList = new ArrayList<>();
c88feda9 109 Packet localPacket = packet.getPacket(PcapProtocol.PCAP);
b6eb4dce
VP
110
111 while (localPacket != null) {
112 subfieldList.clear();
113 for (Map.Entry<String, String> entry : localPacket.getFields().entrySet()) {
114
115 @SuppressWarnings("null")
116 @NonNull String key = entry.getKey();
117
118 @SuppressWarnings("null")
119 @NonNull String value = entry.getValue();
120 subfieldList.add(new TmfEventField(key, value, null));
121 }
122 ITmfEventField[] subfieldArray = subfieldList.toArray(new ITmfEventField[subfieldList.size()]);
123 fieldList.add(new PcapEventField(localPacket.getProtocol().getName(), EMPTY_STRING, subfieldArray, localPacket));
124 localPacket = localPacket.getChildPacket();
125 }
126
127 ITmfEventField[] fieldArray = fieldList.toArray(new ITmfEventField[fieldList.size()]);
128 if (fieldArray == null) {
129 return EMPTY_FIELD_ARRAY;
130 }
131 return fieldArray;
132 }
133}
This page took 0.046045 seconds and 5 git commands to generate.