// AnalyzeDefinition.java package net.sf.gogui.gtp; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.net.URL; import java.util.ArrayList; import net.sf.gogui.util.ErrorMessage; import net.sf.gogui.util.StringUtil; /** Definition of an analyze command. See GoGui documentation, chapter "Analyze Commands". This class is immutable. */ public class AnalyzeDefinition { public AnalyzeDefinition(String line) { String array[] = line.split("/"); String typeStr = array[0]; if (typeStr.equals("bwboard")) m_type = AnalyzeType.BWBOARD; else if (typeStr.equals("cboard")) m_type = AnalyzeType.CBOARD; else if (typeStr.equals("dboard")) m_type = AnalyzeType.DBOARD; else if (typeStr.equals("eplist")) m_type = AnalyzeType.EPLIST; else if (typeStr.equals("gfx")) m_type = AnalyzeType.GFX; else if (typeStr.equals("hstring")) m_type = AnalyzeType.HSTRING; else if (typeStr.equals("hpstring")) m_type = AnalyzeType.HPSTRING; else if (typeStr.equals("param")) m_type = AnalyzeType.PARAM; else if (typeStr.equals("plist")) m_type = AnalyzeType.PLIST; else if (typeStr.equals("pspairs")) m_type = AnalyzeType.PSPAIRS; else if (typeStr.equals("pstring")) m_type = AnalyzeType.PSTRING; else if (typeStr.equals("string")) m_type = AnalyzeType.STRING; else if (typeStr.equals("sboard")) m_type = AnalyzeType.SBOARD; else if (typeStr.equals("var")) m_type = AnalyzeType.VAR; else if (typeStr.equals("varb")) m_type = AnalyzeType.VARB; else if (typeStr.equals("varc")) m_type = AnalyzeType.VARC; else if (typeStr.equals("varp")) m_type = AnalyzeType.VARP; else if (typeStr.equals("varpo")) m_type = AnalyzeType.VARPO; else if (typeStr.equals("varw")) m_type = AnalyzeType.VARW; else m_type = AnalyzeType.NONE; m_label = array[1]; m_command = array[2]; } public AnalyzeDefinition(AnalyzeType type, String label, String command) { m_type = type; m_label = label; m_command = command; } public String getCommand() { return m_command; } public String getLabel() { return m_label; } public AnalyzeType getType() { return m_type; } /** Should the response be shown as text. Returns true for types that should be shown (not necessarily only) as text to the user. That is string and variation commands. */ public boolean isTextType() { return m_type == AnalyzeType.STRING || m_type == AnalyzeType.HSTRING || m_type == AnalyzeType.HPSTRING || m_type == AnalyzeType.PSTRING || m_type == AnalyzeType.VAR || m_type == AnalyzeType.VARC || m_type == AnalyzeType.VARW || m_type == AnalyzeType.VARB || m_type == AnalyzeType.VARP || m_type == AnalyzeType.VARPO; } public boolean needsColorArg() { return (m_command.indexOf("%c") >= 0); } public boolean needsFileArg() { return (m_command.indexOf("%f") >= 0); } public boolean needsFileOpenArg() { return (m_command.indexOf("%r") >= 0); } public boolean needsFileSaveArg() { return (m_command.indexOf("%w") >= 0); } public boolean needsOnlyPointArg() { return (needsPointArg() && ! needsColorArg() && ! needsFileArg() && ! needsFileOpenArg() && ! needsFileSaveArg() && ! needsPointListArg() && ! needsStringArg() && ! needsOptStringArg()); } public boolean needsOnlyPointAndColorArg() { return (needsPointArg() && needsColorArg() && ! needsFileArg() && ! needsFileOpenArg() && ! needsFileSaveArg() && ! needsPointListArg() && ! needsStringArg() && ! needsOptStringArg()); } public boolean needsPointArg() { return (m_command.indexOf("%p") >= 0); } public boolean needsPointListArg() { return (m_command.indexOf("%P") >= 0 || m_type == AnalyzeType.EPLIST); } public boolean needsStringArg() { return (m_command.indexOf("%s") >= 0); } public boolean needsOptStringArg() { return (m_command.indexOf("%o") >= 0); } public static ArrayList<AnalyzeDefinition> read(ArrayList<String> supportedCommands, File analyzeCommands, String programAnalyzeCommands) throws ErrorMessage { if (analyzeCommands != null) { try { Reader fileReader = new FileReader(analyzeCommands); BufferedReader reader = new BufferedReader(fileReader); return readConfig(reader, analyzeCommands.getName(), null); } catch (FileNotFoundException e) { throw new ErrorMessage("File \"" + analyzeCommands + "\" not found"); } } else if (programAnalyzeCommands != null) { Reader stringReader = new StringReader(programAnalyzeCommands); BufferedReader reader = new BufferedReader(stringReader); return readConfig(reader, "program response to gogui-analyze_commands", null); } else { String resource = "net/sf/gogui/gui/analyze-commands"; URL url = ClassLoader.getSystemClassLoader().getResource(resource); if (url == null) return new ArrayList<AnalyzeDefinition>(); try { InputStream inputStream = url.openStream(); Reader inputStreamReader = new InputStreamReader(inputStream); BufferedReader reader = new BufferedReader(inputStreamReader); return readConfig(reader, "builtin default commands", supportedCommands); } catch (IOException e) { throw new ErrorMessage(e.getMessage()); } } } private final AnalyzeType m_type; private final String m_label; private final String m_command; private static ArrayList<AnalyzeDefinition> readConfig(BufferedReader reader, String name, ArrayList<String> supportedCommands) throws ErrorMessage { ArrayList<AnalyzeDefinition> result = new ArrayList<AnalyzeDefinition>(); ArrayList<String> labels = new ArrayList<String>(); try { String line; int lineNumber = 0; while ((line = reader.readLine()) != null) { ++lineNumber; line = line.trim(); if (line.length() > 0 && line.charAt(0) != '#') { String array[] = line.split("/"); if (array.length < 3 || array.length > 5) throw new ErrorMessage("Error in " + name + " line " + lineNumber); if (supportedCommands != null) { String[] cmdArray = StringUtil.splitArguments(array[2].trim()); if (cmdArray.length == 0 || ! supportedCommands.contains(cmdArray[0])) continue; } String label = array[1]; if (labels.contains(label)) continue; labels.add(label); result.add(new AnalyzeDefinition(line)); } } return result; } catch (IOException e) { throw new ErrorMessage("Error reading " + name); } finally { try { reader.close(); } catch (IOException e) { throw new ErrorMessage("Error reading " + name); } } } }