View Javadoc

1   /*
2    * BUD, installer for development platform.
3    *
4    * Copyright(c) 2006 bud-project - http://opensource.org/licenses/apachepl.php
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  //        getPreferences().flush();
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 //        preferences.flush();
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 }