1
2
3
4
5
6 package org.bud.kernel;
7 import java.io.IOException;
8 import java.util.Set;
9 import java.util.TreeSet;
10 import java.util.prefs.BackingStoreException;
11 import java.util.prefs.Preferences;
12 import javax.xml.transform.TransformerException;
13 import org.bud.kernel.model.Release;
14 import org.bud.kernel.model.Version;
15 /***
16 * BUD preferences. On Windows XP, Preferences are backuped into the following registry Key :
17 * HKEY_CURRENT_USER\Software\JavaSoft\Prefs
18 *
19 * TODO : When should i make flush ?
20 */
21 public class LocalPlatform {
22 static final String CURRENT_VERSION = "current-version";
23 public static final String INSTALL_TIME = "when";
24 private static final Version NO_VERSION = new Version(0, 0, 0);
25 static final String NO_SCRIPT_BUILDER_ERROR =
26 "No ScriptBuilder has been set before install";
27 private Preferences preferences;
28 private ScriptBuilder scriptBuilder;
29 private String platformId;
30
31
32 LocalPlatform(String platformId) {
33 this.platformId = platformId;
34 }
35
36
37 public Version getCurrentVersion() {
38 return Version.createVersion(getPreferences().get(CURRENT_VERSION, "0.0"));
39 }
40
41
42 void setCurrentVersion(Version version)
43 throws BackingStoreException {
44 if (version.equals(NO_VERSION)) {
45 getPreferences().remove(CURRENT_VERSION);
46 }
47 else {
48 getPreferences().put(CURRENT_VERSION, version.toString());
49 getPreferences().node(version.toString()).putLong(INSTALL_TIME,
50 System.currentTimeMillis());
51 }
52
53
54 }
55
56
57 public boolean hasBeenInstalled() {
58 return !"n/a".equals(getPreferences().get(CURRENT_VERSION, "n/a"));
59 }
60
61
62 public void install(Release release, ScriptListener listener)
63 throws TransformerException, IOException, BackingStoreException {
64 if (scriptBuilder == null) {
65 throw new IllegalStateException(NO_SCRIPT_BUILDER_ERROR);
66 }
67
68 Script script = scriptBuilder.createInstallScript(release);
69 script.run(listener);
70 setCurrentVersion(release.getVersion());
71 }
72
73
74 public void uninstall(Release release, ScriptListener listener)
75 throws TransformerException, IOException, BackingStoreException {
76 if (scriptBuilder == null) {
77 throw new IllegalStateException(NO_SCRIPT_BUILDER_ERROR);
78 }
79 Script script = scriptBuilder.createUninstallScript(release);
80 script.run(listener);
81
82 String uninstalledVersion = release.getVersion().toString();
83 if (getPreferences().nodeExists(uninstalledVersion)) {
84 getPreferences().node(uninstalledVersion).removeNode();
85 }
86
87 Version[] versions = getInstalledVersion();
88 if (versions.length > 0) {
89 getPreferences().put(CURRENT_VERSION, versions[versions.length - 1].toString());
90 }
91 else {
92 removePreferences();
93 }
94 }
95
96
97 private Version[] getInstalledVersion() throws BackingStoreException {
98 Set installedVerion = new TreeSet();
99 String[] strings = getPreferences().childrenNames();
100 for (int i = 0; i < strings.length; i++) {
101 installedVerion.add(Version.createVersion(strings[i]));
102 }
103 return (Version[])installedVerion.toArray(new Version[installedVerion.size()]);
104 }
105
106
107 public void setScriptBuilder(ScriptBuilder scriptBuilder) {
108 this.scriptBuilder = scriptBuilder;
109 }
110
111
112 public ScriptBuilder getScriptBuilder() {
113 return scriptBuilder;
114 }
115
116
117 public void removePreferences() throws BackingStoreException {
118 if (preferences == null) {
119 return;
120 }
121 preferences.removeNode();
122
123 preferences = null;
124 }
125
126
127 private Preferences getPreferences() {
128 if (preferences == null) {
129 preferences = Preferences.userRoot().node("org").node("bud").node(platformId);
130 }
131 return preferences;
132 }
133 }