// GameReader.java
package net.sf.gogui.gamefile;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStream;
import java.io.IOException;
import java.util.Locale;
import net.sf.gogui.game.GameTree;
import net.sf.gogui.util.ErrorMessage;
import net.sf.gogui.util.FileUtil;
import net.sf.gogui.util.ProgressShow;
import net.sf.gogui.sgf.SgfReader;
import net.sf.gogui.xml.XmlReader;
/** Read a game and detect automatically if it is SGF or XML. */
public class GameReader
{
/** Construct reader and read a game.
@param progressShow Callback to show progress, can be null */
public GameReader(File file, ProgressShow progressShow) throws ErrorMessage
{
m_gameFile = new GameFile();
GameFile.Format format = detectFormat(file);
m_gameFile.m_file = file;
m_gameFile.m_format = format;
InputStream in;
try
{
in = new FileInputStream(file);
}
catch (FileNotFoundException e)
{
throw new ErrorMessage("File \"" + file + "\"not found");
}
switch (format)
{
case XML:
{
XmlReader reader = new XmlReader(in, progressShow,
file.length());
m_tree = reader.getTree();
m_warnings = reader.getWarnings();
}
break;
case SGF:
{
SgfReader reader =
new SgfReader(in, file, progressShow, file.length());
m_tree = reader.getTree();
m_warnings = reader.getWarnings();
}
break;
}
}
public GameReader(File file) throws ErrorMessage
{
this(file, null);
}
public GameFile getFile()
{
return m_gameFile;
}
public GameTree getTree()
{
return m_tree;
}
public String getWarnings()
{
return m_warnings;
}
private GameFile m_gameFile;
private String m_warnings;
private GameTree m_tree;
private static GameFile.Format detectFormat(File file)
{
String extension = FileUtil.getExtension(file);
if (extension != null)
{
extension = extension.toLowerCase(Locale.ENGLISH);
if (extension.equals("sgf"))
return GameFile.Format.SGF;
if (extension.equals("xml"))
return GameFile.Format.XML;
}
FileReader reader = null;
try
{
reader = new FileReader(file);
char[] buffer = new char[5];
int n = reader.read(buffer, 0, 5);
if (n == 5 && new String(buffer).equals("<?xml"))
return GameFile.Format.XML;
}
catch (IOException e)
{
}
finally
{
try
{
if (reader != null)
reader.close();
}
catch (IOException e)
{
}
}
return GameFile.Format.SGF;
}
}