KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > applications > packaging > packagehandlers > DisplayThemePackage


1 /*
2  * This software is OSI Certified Open Source Software.
3  * OSI Certified is a certification mark of the Open Source Initiative.
4  * The license (Mozilla version 1.0) can be read at the MMBase site.
5  * See http://www.MMBase.org/license
6  */

7 package org.mmbase.applications.packaging.packagehandlers;
8
9 import java.io.BufferedOutputStream JavaDoc;
10 import java.io.DataOutputStream JavaDoc;
11 import java.io.File JavaDoc;
12 import java.io.FileOutputStream JavaDoc;
13 import java.io.IOException JavaDoc;
14 import java.io.InputStream JavaDoc;
15 import java.util.Enumeration JavaDoc;
16 import java.util.Iterator JavaDoc;
17 import java.util.jar.JarFile JavaDoc;
18 import java.util.zip.ZipEntry JavaDoc;
19
20 import org.mmbase.applications.packaging.PackageManager;
21 import org.mmbase.applications.packaging.installhandlers.installStep;
22 import org.mmbase.applications.packaging.util.ExtendedDocumentReader;
23 import org.mmbase.module.core.MMBaseContext;
24 import org.mmbase.util.logging.Logger;
25 import org.mmbase.util.logging.Logging;
26 import org.w3c.dom.Element JavaDoc;
27
28 /**
29  * DisplayThemePackage, Handler for theme packages
30  *
31  * @author Daniel Ockeloen (MMBased)
32  */

33 public class DisplayThemePackage extends BasicPackage implements PackageInterface {
34
35     private static Logger log = Logging.getLoggerInstance(DisplayThemePackage.class);
36
37
38     /**
39      *Constructor for the DisplayThemePackage object
40      */

41     public DisplayThemePackage() { }
42
43
44     /**
45      * Description of the Method
46      *
47      * @return Description of the Return Value
48      */

49     public boolean install() {
50         boolean result = true;
51         // needs to be set to false on a error
52
try {
53
54             // step1
55
installStep step = getNextInstallStep();
56             step.setUserFeedBack("display/theme installer started");
57             setProgressBar(1000);
58             // lets have 100 steps;
59

60             // step 2
61
step = getNextInstallStep();
62             step.setUserFeedBack("receiving package ..");
63             JarFile JavaDoc jf = getJarFile();
64             if (jf != null) {
65                 step.setUserFeedBack("receiving package ... done (" + jf + ")");
66
67                 increaseProgressBar(100);
68                 // downloading is 10%
69

70                 // step 3
71
step = getNextInstallStep();
72                 step.setUserFeedBack("checking dependencies ..");
73                 if (dependsInstalled(jf, step)) {
74
75                     increaseProgressBar(100);
76                     // downloading is 20%
77

78                     step.setUserFeedBack("checking dependencies ... done");
79
80                     // step 4
81
step = getNextInstallStep();
82                     step.setUserFeedBack("installing theme ..");
83                     installTheme(jf, step);
84                     step.setUserFeedBack("installing theme ... done");
85
86                     increaseProgressBar(100);
87                     // downloading is 80%
88

89                     // step 5
90
step = getNextInstallStep();
91                     step.setUserFeedBack("updating mmbase registry ..");
92                     updateRegistryInstalled();
93                     increaseProgressBar(100);
94                     // downloading is 90%
95
step.setUserFeedBack("updating mmbase registry ... done");
96                 } else {
97                     step.setUserFeedBack("checking dependencies ... failed");
98                     setState("failed");
99                     result = false;
100                 }
101             } else {
102                 step.setUserFeedBack("getting the mmp package...failed (server down or removed disk ? )");
103                 step.setType(installStep.TYPE_ERROR);
104                 try {
105                     Thread.sleep(2000);
106                 } catch(Exception JavaDoc ee) {}
107             }
108
109
110             // step 6
111
step = getNextInstallStep();
112             step.setUserFeedBack("display/theme installer ended");
113             increaseProgressBar(100);
114             // downloading is 100%
115

116         } catch (Exception JavaDoc e) {
117             log.error("install crash on : " + this);
118             result = false;
119         }
120         return result;
121     }
122
123
124     /**
125      * Description of the Method
126      *
127      * @return Description of the Return Value
128      */

129     public boolean uninstall() {
130         try {
131
132             // step1
133
installStep step = getNextInstallStep();
134             step.setUserFeedBack("display/theme uninstaller started");
135
136             // step 3
137
step = getNextInstallStep();
138             step.setUserFeedBack("updating mmbase registry ..");
139             updateRegistryUninstalled();
140             step.setUserFeedBack("updating mmbase registry ... done");
141
142             // step 4
143
step = getNextInstallStep();
144             step.setUserFeedBack("display/theme installer ended");
145
146         } catch (Exception JavaDoc e) {
147             log.error("install crash on : " + this);
148         }
149         return true;
150     }
151
152
153     /**
154      * Description of the Method
155      *
156      * @param jf Description of the Parameter
157      * @param step Description of the Parameter
158      * @return Description of the Return Value
159      */

160     private boolean installTheme(JarFile JavaDoc jf, installStep step) {
161     String JavaDoc themename = null;
162         Enumeration JavaDoc e = jf.entries();
163         increaseProgressBar(100);
164         // downloading is 30%
165
while (e.hasMoreElements()) {
166             increaseProgressBar(1);
167             // downloading is 1%
168
ZipEntry JavaDoc zippy = (ZipEntry JavaDoc) e.nextElement();
169
170             // this is just a demo version, the html package people should figure
171
// out the real format.
172
String JavaDoc name = zippy.getName();
173
174             // only unpack all files except the theme file
175
if (name.indexOf("META-INF")==-1) {
176             String JavaDoc localfile = MMBaseContext.getHtmlRoot() + File.separator + "mmbase"+File.separator+"thememanager"+File.separator+name;
177                 if (name.indexOf("theme.xml")!=-1) {
178                 localfile = PackageManager.getConfigPath() + File.separator + "thememanager" + File.separator + "themes"+ File.separator+name;
179             themename = name.substring(0,name.indexOf('/'));
180             String JavaDoc dirname = MMBaseContext.getHtmlRoot() + File.separator + "mmbase"+File.separator+"thememanager"+File.separator+"images"+File.separator+themename;
181                         File JavaDoc d = new File JavaDoc(dirname);
182                         if (!d.exists()) {
183                             d.mkdir();
184             }
185                 dirname = PackageManager.getConfigPath() + File.separator + "thememanager" + File.separator + "themes"+ File.separator+themename;
186                         d = new File JavaDoc(dirname);
187                         if (!d.exists()) {
188                             d.mkdir();
189             }
190             dirname = MMBaseContext.getHtmlRoot() + File.separator + "mmbase"+File.separator+"thememanager"+File.separator+"css"+File.separator+themename;
191                         d = new File JavaDoc(dirname);
192                         if (!d.exists()) {
193                             d.mkdir();
194             }
195             }
196
197
198                 installStep substep = step.getNextInstallStep();
199
200                 // check if its a dir or a file
201
if (zippy.isDirectory()) {
202                     File JavaDoc d = new File JavaDoc(localfile);
203                     if (!d.exists()) {
204                         substep.setUserFeedBack("creating dir : " + localfile + ".. ");
205                         d.mkdir();
206                         substep.setUserFeedBack("creating dir : " + localfile + ".. done");
207                     }
208                 } else {
209                     substep.setUserFeedBack("creating file : " + localfile + ".. ");
210                     try {
211                         InputStream JavaDoc in = jf.getInputStream(zippy);
212                         BufferedOutputStream JavaDoc out = new BufferedOutputStream JavaDoc(new FileOutputStream JavaDoc(localfile));
213                         int val;
214                         while ((val = in.read()) != -1) {
215                             out.write(val);
216                         }
217                         out.close();
218                         substep.setUserFeedBack("creating file : " + localfile + ".. done");
219                     } catch (IOException JavaDoc f) {
220                         substep.setUserFeedBack("creating file : " + localfile + ".. failed");
221                         f.printStackTrace();
222                     }
223                 }
224         }
225         }
226     if (themename != null) {
227                 installStep substep = step.getNextInstallStep();
228                 substep.setUserFeedBack("adding theme to manager ... ");
229         if (addThemeName(themename)) {
230                         substep.setUserFeedBack("adding theme to manager ... done ");
231         } else {
232                         substep.setUserFeedBack("adding theme to manager ... failed ");
233         }
234     }
235         increaseProgressBar(100);
236         // downloading is 70%
237
return true;
238     }
239    
240     private boolean addThemeName(String JavaDoc themename) {
241         String JavaDoc themedir = PackageManager.getConfigPath() + File.separator + "thememanager" + File.separator;
242         ExtendedDocumentReader reader = new ExtendedDocumentReader(themedir + "themes.xml", DisplayThemePackage.class);
243         String JavaDoc body = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
244         body += "<!DOCTYPE themes PUBLIC \"//MMBase - themes //\" \"http://www.mmbase.org/dtd/themes_1_0.dtd\">\n";
245         body += "<themes>\n";
246         boolean found = false;
247         for (Iterator JavaDoc ns = reader.getChildElements("themes", "theme"); ns.hasNext(); ) {
248             Element JavaDoc n = (Element JavaDoc) ns.next();
249             String JavaDoc oldname = n.getAttribute("id");
250             String JavaDoc oldfile = n.getAttribute("file");
251             body += "\t<theme id=\"" + oldname + "\" file=\"" + oldfile + "\" />\n";
252             if (themename.equals(oldname)) {
253                 found = true;
254             }
255         }
256
257         if (!found) {
258             body += "\t<theme id=\"" + themename + "\" file=\"themes/" + themename + "/theme.xml\" />\n";
259             body += "</themes>\n";
260             saveFile(themedir + "themes.xml", body);
261         }
262     return true;
263     }
264
265
266     /**
267      * Description of the Method
268      *
269      * @param filename Description of the Parameter
270      * @param value Description of the Parameter
271      * @return Description of the Return Value
272      */

273     static boolean saveFile(String JavaDoc filename, String JavaDoc value) {
274         File JavaDoc sfile = new File JavaDoc(filename);
275         try {
276             DataOutputStream JavaDoc scan = new DataOutputStream JavaDoc(new FileOutputStream JavaDoc(sfile));
277             scan.writeBytes(value);
278             scan.flush();
279             scan.close();
280         } catch (Exception JavaDoc e) {
281             log.error(Logging.stackTrace(e));
282         }
283         return true;
284     }
285
286 }
287
288
Popular Tags