// FileCheck.java
package net.sf.gogui.tools.statistics;
import java.io.InputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import net.sf.gogui.game.ConstNode;
import net.sf.gogui.game.GameTree;
import net.sf.gogui.go.GoColor;
import static net.sf.gogui.go.GoColor.BLACK;
import static net.sf.gogui.go.GoColor.EMPTY;
import net.sf.gogui.go.Move;
import net.sf.gogui.sgf.SgfReader;
import net.sf.gogui.util.ErrorMessage;
/** Check that SGF files meet the requirements for a Statistics run. */
public class FileCheck
{
public FileCheck(ArrayList<String> sgfFiles, int size, boolean allowSetup)
throws ErrorMessage
{
m_size = size;
m_allowSetup = allowSetup;
for (int i = 0; i < sgfFiles.size(); ++i)
{
m_file = new File(sgfFiles.get(i));
checkFile();
}
}
private final boolean m_allowSetup;
private final int m_size;
private File m_file;
private void checkFile() throws ErrorMessage
{
InputStream in = null;
try
{
in = new FileInputStream(m_file);
}
catch (FileNotFoundException e)
{
throwError("file not found");
}
SgfReader reader = new SgfReader(in, m_file, null, 0);
GameTree tree = reader.getTree();
if (tree.getBoardSize() != m_size)
throwError("size is not " + m_size);
ConstNode root = tree.getRoot();
GoColor toMove = BLACK;
for (ConstNode node = root; node != null; node = node.getChildConst())
{
if (node.hasSetup())
{
if (m_allowSetup)
{
if (node == root)
toMove = EMPTY;
else
throw new ErrorMessage("setup stones"
+ " in non-root position");
}
else
throw new ErrorMessage("contains setup stones");
}
Move move = node.getMove();
if (move != null)
{
if (toMove == EMPTY)
toMove = move.getColor();
if (move.getColor() != toMove)
throwError("non-alternating moves");
toMove = toMove.otherColor();
}
}
}
private void throwError(String reason) throws ErrorMessage
{
throw new ErrorMessage(m_file + ": " + reason);
}
}