package de.uhilger.avdirektor;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author ulrich
*/
public class OMXLogLeser {
private static final Logger logger = Logger.getLogger(OMXLogLeser.class.getName());
public static final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
private static final long MILLIS = (long) 1000;
private static final long MINSEC = (long) 60;
/**
*
*
Die Spieldauer laut OMX-Log ergibt sich aus dem Zeitstempel des
* letzten Eintrags abzueglich des Zeitstempels des
* ersten Eintrags abzueglich der Pausen
*
* Eine Pause ist der Zeitraum vom Zeitstempel eines Eintrags mit
* Keyboard: character p (0x70)
bis zum Zeitstempel des
* nächsten Eintrags mit Keyboard: character p
*
*
* @param logfile
* @return die Spieldauer als String im Format H:MM:SS
* @throws FileNotFoundException
* @throws IOException
* @throws ParseException
*/
public String lesen(File logfile) throws FileNotFoundException, IOException, ParseException {
boolean inPause = false;
logger.info("Starting to parse log..");
Date parseStart = new Date();
long lineCount = 0;
InputStream is = new FileInputStream(logfile);
BufferedReader r = new BufferedReader(new InputStreamReader(is));
String firstLine = r.readLine();
++lineCount;
String lastLine = "";
String line = r.readLine();
Blocks blocks = new Blocks();
Block currentBlock = new Block();
while(line != null) {
++lineCount;
if(currentBlock.getStart() == null) {
currentBlock.setStart(line.substring(0, 8));
}
if(line.contains("Keyboard: character p")) {
if(inPause) {
currentBlock.setStart(line.substring(0, 8));
} else {
currentBlock.setEnd(line.substring(0, 8));
blocks.add(currentBlock);
currentBlock = new Block();
}
inPause = !inPause;
}
lastLine = line;
line = r.readLine();
}
currentBlock.setEnd(lastLine.substring(0, 8));
blocks.add(currentBlock);
Date parseEnd = new Date();
long timeMillis = parseEnd.getTime() - parseStart.getTime();
long timeSeconds = timeMillis / MILLIS;
long secMillis = timeSeconds * MILLIS;
long restMillis = timeMillis - secMillis;
logger.log(Level.INFO,
"{0} lines parsed in {1} seconds and {2} milliseconds.",
new Object[]{lineCount, timeSeconds, restMillis});
return blocks.getTimeString();
}
class Block {
private String start = null;
private String end = null;
public long getDuration() throws ParseException {
Date startDate = sdf.parse(start);
Date endDate = sdf.parse(end);
return endDate.getTime() - startDate.getTime();
}
public String getStart() {
return start;
}
public void setStart(String start) {
//logger.log(Level.FINER, "Start: ''{0}''", start);
this.start = start;
}
public String getEnd() {
return end;
}
public void setEnd(String end) {
//logger.log(Level.FINER, "End: ''{0}''", end);
this.end = end;
}
}
class Blocks {
private final List blocks = new ArrayList();
public void add(Block block) {
blocks.add(block);
}
public long getDuration() throws ParseException {
long duration = (long) 0;
Iterator i = blocks.iterator();
while(i.hasNext()) {
Block b = i.next();
duration += b.getDuration();
}
return duration;
}
public String getTimeString() throws ParseException {
long diff = getDuration();
long h = diff / MILLIS / MINSEC / MINSEC;
long hmillis = h * MINSEC * MINSEC * MILLIS;
long m = (diff - hmillis) / MILLIS / MINSEC;
long mmillis = m * MINSEC * MILLIS;
long s = (diff - hmillis - mmillis) / MILLIS;
//logger.log(Level.FINER, "{0}:{1}:{2}", new Object[]{h, m, s});
return h + ":" + m + ":" + s;
}
}
}