/*******************************************************************************
* Copyright (c) 2014 Ericsson
*
* 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:
* Vincent Perot - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.internal.tmf.pcap.core.event;
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import org.eclipse.tracecompass.internal.pcap.core.packet.Packet;
import org.eclipse.tracecompass.internal.pcap.core.protocol.PcapProtocol;
import org.eclipse.tracecompass.internal.pcap.core.protocol.pcap.PcapPacket;
import org.eclipse.tracecompass.internal.pcap.core.stream.PacketStreamBuilder;
import org.eclipse.tracecompass.internal.tmf.pcap.core.protocol.TmfPcapProtocol;
import org.eclipse.tracecompass.internal.tmf.pcap.core.util.ProtocolConversion;
/**
* Class that wraps a PacketStreamBuilder.
*
* @author Vincent Perot
*/
public class TmfPacketStreamBuilder {
private final PacketStreamBuilder fBuilder;
/**
* Constructor.
*
* @param protocol
* The protocol of the streams to build.
*/
public TmfPacketStreamBuilder(TmfPcapProtocol protocol) {
fBuilder = new PacketStreamBuilder(ProtocolConversion.unwrap(protocol));
}
/**
* Method that adds an event to this builder.
*
* @param event
* The event to add.
*/
public synchronized void addEventToStream(PcapEvent event) {
Packet packet = event.getPacket().getPacket(PcapProtocol.PCAP);
if (!(packet instanceof PcapPacket)) {
return;
}
PcapPacket pcapPacket = (PcapPacket) packet;
fBuilder.addPacketToStream(pcapPacket);
}
/**
* Method that returns the number of streams built.
*
* @return The number of streams built.
*/
public synchronized int getNbStreams() {
return fBuilder.getNbStreams();
}
/**
* Method that returns an iterable on the streams built so far.
*
* @return An iterable on the streams.
*/
public synchronized Iterable<TmfPacketStream> getStreams() {
// We can't store in immutable list since the stream number/content can
// change dynamically.
return StreamSupport.stream(fBuilder.getStreams().spliterator(), false)
.map(e -> new TmfPacketStream(e))
.collect(Collectors.toCollection(ArrayList::new));
}
}