/*
* Copyright (c) 2013-2015 mgm technology partners GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.mgmtp.perfload.perfalyzer.util;
import static com.mgmtp.perfload.perfalyzer.constants.PerfAlyzerConstants.DELIMITER;
import static java.util.stream.Collectors.toList;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.time.ZonedDateTime;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import org.apache.commons.lang3.text.StrTokenizer;
/**
* @author ctchinda
*/
public class MarkersReader {
private static final String MARKER = "[[marker]]";
private static final String MARKER_LEFT = "left";
private static final String MARKER_RIGHT = "right";
private static final int COL_TIMESTAMP = 0;
private static final int COL_MARKER = 1;
private static final int COL_MARKER_NAME = 2;
private static final int COL_MARKER_TYPE = 3;
private final File inputFile;
private final ZonedDateTime testStart;
public MarkersReader(final File inputFile, final ZonedDateTime testStart) {
this.inputFile = inputFile;
this.testStart = testStart;
}
public List<Marker> readMarkers() throws IOException {
Map<String, Marker> markers = new LinkedHashMap<>();
StrTokenizer tokenizer = StrTokenizer.getCSVInstance();
tokenizer.setDelimiterChar(DELIMITER);
try (FileInputStream fis = new FileInputStream(inputFile)) {
for (Scanner scanner = new Scanner(fis); scanner.hasNext(); ) {
String line = scanner.nextLine();
if (line.startsWith("#")) {
continue;
}
tokenizer.reset(line);
List<String> tokenList = tokenizer.getTokenList();
if (MARKER.equals(tokenList.get(COL_MARKER))) {
// no whitespace allowed in marker in order to avoid issues in HTML
String markerName = tokenList.get(COL_MARKER_NAME).replaceAll("\\s+", "_");
String markerType = tokenList.get(COL_MARKER_TYPE);
long timeMillis = Long.parseLong(tokenList.get(COL_TIMESTAMP));
switch (markerType) {
case MARKER_LEFT: {
Marker marker = new Marker(markerName);
markers.put(markerName, marker);
marker.setLeftMillis(timeMillis);
break;
}
case MARKER_RIGHT: {
Marker marker = markers.get(markerName);
marker.setRightMillis(timeMillis);
break;
}
default:
throw new IllegalStateException("Invalid marker type: " + markerType);
}
}
}
return markers.values().stream().map(marker -> {
marker.calculateDateTimeFields(testStart);
return marker;
}).collect(toList());
}
}
}