/*
* This file is part of jsFlow.
*
* Copyright (c) 2009 DE-CIX Management GmbH <http://www.de-cix.net> - All rights
* reserved.
*
* Author: Thomas King <thomas.king@de-cix.net>
*
* This software is licensed under the Apache License, version 2.0. A copy of
* the license agreement is included in this distribution.
*/
package net.decix.jsflow.header;
import net.decix.util.HeaderBytesException;
import net.decix.util.HeaderParseException;
import net.decix.util.Utility;
public class SampleDataHeader {
public final static long EXPANDEDFLOWSAMPLE = 3;
public final static long EXPANDEDCOUNTERSAMPLE = 4;
private long sampleDataFormat; // 20 bit enterprise & 12 bit format; standard enterprise 0, format 1, 2, 3, 4
private long sampleLength; // in byte
private ExpandedFlowSampleHeader expandedFlowSampleHeader;
private ExpandedCounterSampleHeader expandedCounterSampleHeader;
public SampleDataHeader() {
}
public void setSampleDataFormat(long format) {
this.sampleDataFormat = format;
}
public void setSampleLength(long sampleLength) {
this.sampleLength = sampleLength;
}
public long getSampleDataFormat() {
return sampleDataFormat;
}
public long getSampleLength() {
return sampleLength;
}
public void setExpandedFlowSampleHeader(ExpandedFlowSampleHeader efs) {
expandedFlowSampleHeader = efs;
}
public ExpandedFlowSampleHeader getExpandedFlowSampleHeader() {
return expandedFlowSampleHeader;
}
public void setExpandedCounterSampleHeader(ExpandedCounterSampleHeader ecs) {
expandedCounterSampleHeader = ecs;
}
public ExpandedCounterSampleHeader getExpandedCounterSampleHeader() {
return expandedCounterSampleHeader;
}
public static SampleDataHeader parse(byte[] data) throws HeaderParseException {
try {
if (data.length < 8) throw new HeaderParseException("Data array too short.");
SampleDataHeader sdh = new SampleDataHeader();
// format
byte[] format = new byte[4];
System.arraycopy(data, 0, format, 0, 4);
sdh.setSampleDataFormat(Utility.fourBytesToLong(format));
// length
byte[] length = new byte[4];
System.arraycopy(data, 4, length, 0, 4);
sdh.setSampleLength(Utility.fourBytesToLong(length));
if (sdh.getSampleDataFormat() == EXPANDEDFLOWSAMPLE) {
byte[] subData = new byte[(int) sdh.getSampleLength()];
System.arraycopy(data, 8, subData, 0, (int) sdh.getSampleLength());
ExpandedFlowSampleHeader efs = ExpandedFlowSampleHeader.parse(subData);
sdh.setExpandedFlowSampleHeader(efs);
}
if (sdh.getSampleDataFormat() == EXPANDEDCOUNTERSAMPLE) {
byte[] subData = new byte[(int) sdh.getSampleLength()];
System.arraycopy(data, 8, subData, 0, (int) sdh.getSampleLength());
ExpandedCounterSampleHeader ecs = ExpandedCounterSampleHeader.parse(subData);
sdh.setExpandedCounterSampleHeader(ecs);
}
if ((sdh.getSampleDataFormat() != EXPANDEDFLOWSAMPLE) && (sdh.getSampleDataFormat() != EXPANDEDCOUNTERSAMPLE)) {
System.err.println("Sample data format not yet supported: " + sdh.getSampleDataFormat());
}
return sdh;
} catch (Exception e) {
throw new HeaderParseException("Parse error: " + e.getMessage());
}
}
public byte[] getBytes() throws HeaderBytesException {
try {
int length = 0;
byte[] expandedFlowSampleHeaderBytes = null;
byte[] expandedCounterSampleHeaderBytes = null;
if (expandedFlowSampleHeader != null) {
expandedFlowSampleHeaderBytes = expandedFlowSampleHeader.getBytes();
length += expandedFlowSampleHeaderBytes.length;
}
if (expandedCounterSampleHeader != null) {
expandedCounterSampleHeaderBytes = expandedCounterSampleHeader.getBytes();
length += expandedCounterSampleHeaderBytes.length;
}
byte[] data = new byte[8 + length];
// format
System.arraycopy(Utility.longToFourBytes(sampleDataFormat), 0, data, 0, 4);
// length
System.arraycopy(Utility.longToFourBytes(sampleLength), 0, data, 4, 4);
// expanded flow sample header
if (expandedFlowSampleHeader != null) System.arraycopy(expandedFlowSampleHeaderBytes, 0, data, 8, expandedFlowSampleHeaderBytes.length);
// expanded counter sample header
if (expandedCounterSampleHeader != null) System.arraycopy(expandedCounterSampleHeaderBytes, 0, data, 8, expandedCounterSampleHeaderBytes.length);
return data;
} catch (Exception e) {
throw new HeaderBytesException("Error while generating the bytes: " + e.getMessage());
}
}
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("[SampleHeader]: ");
sb.append(", Format: ");
sb.append(sampleDataFormat);
sb.append(", Length: ");
sb.append(sampleLength);
sb.append(", ");
if (this.getSampleDataFormat() == EXPANDEDCOUNTERSAMPLE) {
sb.append(expandedCounterSampleHeader);
} else if (this.getSampleDataFormat() == EXPANDEDFLOWSAMPLE) {
sb.append(expandedFlowSampleHeader);
} else {
sb.append("SampleFormat yet unsupported");
}
return sb.toString();
}
}