/*
* Copyright (C) 2014 Alfons Wirtz
* website www.freerouting.net
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License at <http://www.gnu.org/licenses/>
* for more details.
*/
package interactive;
import geometry.planar.FloatPoint;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
/**
* Logfile to track the actions in the interactive board handling
* for automatic replay.
*
* @author Alfons Wirtz
*
*/
public class Logfile
{
/**
* opens the logfile for reading
*/
public boolean start_read(InputStream p_input_stream)
{
this.scanner = new LogfileScanner(p_input_stream);
return (this.scanner != null);
}
/**
* Reads the next corner from the logfile.
* Return null, if no valid corner is found.
*/
public FloatPoint read_corner()
{
double x = 0;
double y = 0;
for (int i = 0; i < 2; ++i)
{
Object curr_ob = this.next_token();
if (!(curr_ob instanceof Double))
{
this.pending_token = curr_ob;
return null;
}
double f = ((Double) curr_ob).doubleValue();
if (i == 0)
{
x = f;
}
else
{
y = f;
}
}
return new FloatPoint(x, y);
}
/**
* closes the logfile after writing
*/
public void close_output()
{
if (this.file_writer != null)
{
try
{
this.file_writer.close();
}
catch (IOException e)
{
System.out.println("unable to close logfile");
}
}
this.write_enabled = false;
}
/**
* opens a logfile for writing
*/
public boolean start_write(File p_file)
{
try
{
this.file_writer = new FileWriter(p_file);
}
catch (IOException e)
{
System.out.println("unable to create logfile");
return false;
}
write_enabled = true;
return true;
}
/**
* Marks the beginning of a new item in the olutput stream
*/
public void start_scope(LogfileScope p_logfile_scope)
{
if (write_enabled)
{
try
{
this.file_writer.write(p_logfile_scope.name);
this.file_writer.write("\n");
}
catch (IOException e2)
{
System.out.println("Logfile.start_scope: write failed");
}
}
}
/**
* Marks the beginning of a new scope in the olutput stream
* Writes also an integer value.
*/
public void start_scope(LogfileScope p_logfile_scope, int p_int_value)
{
start_scope(p_logfile_scope);
add_int(p_int_value);
}
/**
* Marks the beginning of a new scope in the olutput stream
* Writes also 1, if p_boolean_value is true, or 0, if p_boolean_value is false;
*/
public void start_scope(LogfileScope p_logfile_scope, boolean p_boolean_value)
{
start_scope(p_logfile_scope);
int int_value;
if (p_boolean_value)
{
int_value = 1;
}
else
{
int_value = 0;
}
add_int(int_value);
}
/**
* Marks the beginning of a new item in the olutput stream
* Writes also the start corner.
*/
public void start_scope(LogfileScope p_logfile_scope, FloatPoint p_start_corner)
{
start_scope(p_logfile_scope);
add_corner(p_start_corner);
}
/**
* Reads the next scope iidentifier from the logfile.
* Returns null if no more item scope was found.
*/
public LogfileScope start_read_scope()
{
Object curr_ob = this.next_token();
if (curr_ob == null)
{
return null;
}
if (!(curr_ob instanceof String))
{
System.out.println("Logfile.start_read_scope: String expected");
this.pending_token = curr_ob;
return null;
}
LogfileScope result = LogfileScope.get_scope((String) curr_ob);
return result;
}
/**
* adds an int to the logfile
*/
public void add_int(int p_int)
{
if (write_enabled)
{
try
{
this.file_writer.write((new Integer(p_int)).toString());
this.file_writer.write("\n");
}
catch (IOException e2)
{
System.out.println("unable to write integer to logfile");
}
}
}
/**
* Reads the next int from the logfile.
* Returns -1, if no valid integer was found.
*/
public int read_int()
{
Object curr_ob = this.next_token();
if (!(curr_ob instanceof Integer))
{
System.out.println("Logfile.read_int: Integer expected");
this.pending_token = curr_ob;
return -1;
}
return (((Integer) curr_ob).intValue());
}
/**
* adds a FloatPoint to the logfile
*/
public void add_corner(FloatPoint p_corner)
{
if (write_enabled)
{
if (p_corner == null)
{
System.out.println("logfile.add_corner: p_corner is null");
return;
}
try
{
this.file_writer.write((new Double(p_corner.x)).toString());
this.file_writer.write(" ");
this.file_writer.write((new Double(p_corner.y)).toString());
this.file_writer.write("\n");
}
catch (IOException e2)
{
System.out.println("unable to write to logfile while adding corner");
}
}
}
private Object next_token()
{
if (this.pending_token != null)
{
Object result = this.pending_token;
this.pending_token = null;
return result;
}
try
{
Object result = this.scanner.next_token();
return result;
}
catch (IOException e)
{
System.out.println("Logfile.next_token: IO error scanning file");
return null;
}
}
private LogfileScanner scanner = null;
private FileWriter file_writer = null;
private boolean write_enabled = false;
private Object pending_token = null;
}