1 // Program.java
2 
3 package net.sf.gogui.gui;
4 
5 import java.util.ArrayList;
6 import java.util.prefs.Preferences;
7 import static net.sf.gogui.gui.I18n.i18n;
8 import net.sf.gogui.util.PrefUtil;
9 import net.sf.gogui.util.ObjectUtil;
10 import net.sf.gogui.util.StringUtil;
11 
12 /** Command line and other information to run a GTP engine. */
13 public final class Program
14 {
15     public String m_label;
16 
17     public String m_name;
18 
19     public String m_version;
20 
21     public String m_command;
22 
23     public String m_workingDirectory;
24 
Program(Program program)25     public Program(Program program)
26     {
27         copyFrom(program);
28     }
29 
Program(String label, String name, String version, String command, String workingDirectory)30     public Program(String label, String name, String version, String command,
31                    String workingDirectory)
32     {
33         init(label, name, version, command, workingDirectory);
34     }
35 
copyFrom(Program program)36     public void copyFrom(Program program)
37     {
38         init(program.m_label, program.m_name, program.m_version,
39              program.m_command, program.m_workingDirectory);
40     }
41 
42     /** Find program info for a given command in a list of program infos.
43         @return The program info or null if no program with this comamnd
44         exists */
findProgram(ArrayList<Program> programs, String command)45     public static Program findProgram(ArrayList<Program> programs,
46                                       String command)
47     {
48         for (Program p : programs)
49             if (p.m_command.equals(command))
50                 return p;
51         return null;
52     }
53 
load()54     public static ArrayList<Program> load()
55     {
56         ArrayList<Program> programs = new ArrayList<Program>();
57         Preferences prefs = PrefUtil.getNode("net/sf/gogui/gui/program");
58         if (prefs == null)
59             return programs;
60         int size = prefs.getInt("size", 0);
61         for (int i = 0; i < size; ++i)
62         {
63             prefs = PrefUtil.getNode("net/sf/gogui/gui/program/" + i);
64             if (prefs == null)
65                 break;
66             String label = prefs.get("label", null);
67             if (label == null)
68                 break;
69             String name = prefs.get("name", "");
70             String version = prefs.get("version", "");
71             String command = prefs.get("command", "");
72             String workingDirectory = prefs.get("working-directory", "");
73             programs.add(new Program(label, name, version, command,
74                                      workingDirectory));
75         }
76         return programs;
77     }
78 
save(ArrayList<Program> programs)79     public static void save(ArrayList<Program> programs)
80     {
81         Preferences prefs = PrefUtil.createNode("net/sf/gogui/gui/program");
82         if (prefs == null)
83             return;
84         prefs.putInt("size", programs.size());
85         for (int i = 0; i < programs.size(); ++i)
86         {
87             prefs = PrefUtil.createNode("net/sf/gogui/gui/program/" + i);
88             if (prefs == null)
89                 break;
90             Program p = programs.get(i);
91             prefs.put("label", p.m_label);
92             prefs.put("name", p.m_name);
93             prefs.put("version", p.m_version);
94             prefs.put("command", p.m_command);
95             prefs.put("working-directory", p.m_workingDirectory);
96         }
97     }
98 
99     /** Suggest and set a label derived from program name without
100         collision with an existing array of programs. */
setUniqueLabel(ArrayList<Program> programs)101     public void setUniqueLabel(ArrayList<Program> programs)
102     {
103         String label = m_name;
104         if (StringUtil.isEmpty(label))
105             label = i18n("LB_UNKNOWN_PROGRAM");
106         String tryLabel = label;
107         boolean alreadyExists = false;
108         for (int i = 0; i < programs.size(); ++i)
109             if (tryLabel.equals((programs.get(i)).m_label))
110             {
111                 alreadyExists = true;
112                 break;
113             }
114         if (! alreadyExists)
115         {
116             m_label = tryLabel;
117             return;
118         }
119         for (int i = 2; ; ++i)
120         {
121             tryLabel = label + " (" + i + ")";
122             alreadyExists = false;
123             for (int j = 0; j < programs.size(); ++j)
124                 if (tryLabel.equals((programs.get(j)).m_label))
125                 {
126                     alreadyExists = true;
127                     break;
128                 }
129             if (! alreadyExists)
130             {
131                 m_label = tryLabel;
132                 return;
133             }
134         }
135     }
136 
137     /** Update program information if changed.
138         Useful, if a program was replaced, and reports a different name or
139         version than at the last invocation.
140         @param name Program name at current invovation (may be null)
141         @param version Program name at current invovation (may be null)
142         @return true, if name or version program was updated */
updateInfo(String name, String version)143     public boolean updateInfo(String name, String version)
144     {
145         if (name == null)
146             name = "";
147         if (version == null)
148             version = "";
149         boolean changed = false;
150         if (! ObjectUtil.equals(m_name, name))
151         {
152             m_name = name;
153             changed = true;
154         }
155         if (! ObjectUtil.equals(m_version, version))
156         {
157             m_version = version;
158             changed = true;
159         }
160         return changed;
161     }
162 
init(String label, String name, String version, String command, String workingDirectory)163     private void init(String label, String name, String version,
164                       String command, String workingDirectory)
165     {
166         m_label = label.trim();
167         m_name = name.trim();
168         m_version = version.trim();
169         m_command = command.trim();
170         m_workingDirectory = workingDirectory.trim();
171     }
172 }
173