// Program.java
package net.sf.gogui.gui;
import java.util.ArrayList;
import java.util.prefs.Preferences;
import static net.sf.gogui.gui.I18n.i18n;
import net.sf.gogui.util.PrefUtil;
import net.sf.gogui.util.ObjectUtil;
import net.sf.gogui.util.StringUtil;
/** Command line and other information to run a GTP engine. */
public final class Program
{
public String m_label;
public String m_name;
public String m_version;
public String m_command;
public String m_workingDirectory;
public Program(Program program)
{
copyFrom(program);
}
public Program(String label, String name, String version, String command,
String workingDirectory)
{
init(label, name, version, command, workingDirectory);
}
public void copyFrom(Program program)
{
init(program.m_label, program.m_name, program.m_version,
program.m_command, program.m_workingDirectory);
}
/** Find program info for a given command in a list of program infos.
@return The program info or null if no program with this comamnd
exists */
public static Program findProgram(ArrayList<Program> programs,
String command)
{
for (Program p : programs)
if (p.m_command.equals(command))
return p;
return null;
}
public static ArrayList<Program> load()
{
ArrayList<Program> programs = new ArrayList<Program>();
Preferences prefs = PrefUtil.getNode("net/sf/gogui/gui/program");
if (prefs == null)
return programs;
int size = prefs.getInt("size", 0);
for (int i = 0; i < size; ++i)
{
prefs = PrefUtil.getNode("net/sf/gogui/gui/program/" + i);
if (prefs == null)
break;
String label = prefs.get("label", null);
if (label == null)
break;
String name = prefs.get("name", "");
String version = prefs.get("version", "");
String command = prefs.get("command", "");
String workingDirectory = prefs.get("working-directory", "");
programs.add(new Program(label, name, version, command,
workingDirectory));
}
return programs;
}
public static void save(ArrayList<Program> programs)
{
Preferences prefs = PrefUtil.createNode("net/sf/gogui/gui/program");
if (prefs == null)
return;
prefs.putInt("size", programs.size());
for (int i = 0; i < programs.size(); ++i)
{
prefs = PrefUtil.createNode("net/sf/gogui/gui/program/" + i);
if (prefs == null)
break;
Program p = programs.get(i);
prefs.put("label", p.m_label);
prefs.put("name", p.m_name);
prefs.put("version", p.m_version);
prefs.put("command", p.m_command);
prefs.put("working-directory", p.m_workingDirectory);
}
}
/** Suggest and set a label derived from program name without
collision with an existing array of programs. */
public void setUniqueLabel(ArrayList<Program> programs)
{
String label = m_name;
if (StringUtil.isEmpty(label))
label = i18n("LB_UNKNOWN_PROGRAM");
String tryLabel = label;
boolean alreadyExists = false;
for (int i = 0; i < programs.size(); ++i)
if (tryLabel.equals((programs.get(i)).m_label))
{
alreadyExists = true;
break;
}
if (! alreadyExists)
{
m_label = tryLabel;
return;
}
for (int i = 2; ; ++i)
{
tryLabel = label + " (" + i + ")";
alreadyExists = false;
for (int j = 0; j < programs.size(); ++j)
if (tryLabel.equals((programs.get(j)).m_label))
{
alreadyExists = true;
break;
}
if (! alreadyExists)
{
m_label = tryLabel;
return;
}
}
}
/** Update program information if changed.
Useful, if a program was replaced, and reports a different name or
version than at the last invocation.
@param name Program name at current invovation (may be null)
@param version Program name at current invovation (may be null)
@return true, if name or version program was updated */
public boolean updateInfo(String name, String version)
{
if (name == null)
name = "";
if (version == null)
version = "";
boolean changed = false;
if (! ObjectUtil.equals(m_name, name))
{
m_name = name;
changed = true;
}
if (! ObjectUtil.equals(m_version, version))
{
m_version = version;
changed = true;
}
return changed;
}
private void init(String label, String name, String version,
String command, String workingDirectory)
{
m_label = label.trim();
m_name = name.trim();
m_version = version.trim();
m_command = command.trim();
m_workingDirectory = workingDirectory.trim();
}
}