KickJava   Java API By Example, From Geeks To Geeks.

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


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.InputStream JavaDoc;
10 import java.util.Iterator JavaDoc;
11 import java.util.jar.JarEntry JavaDoc;
12 import java.util.jar.JarFile JavaDoc;
13
14 import org.mmbase.applications.packaging.installhandlers.installStep;
15 import org.mmbase.applications.packaging.util.ExtendedDocumentReader;
16 import org.mmbase.module.core.MMBase;
17 import org.mmbase.module.core.MMObjectBuilder;
18 import org.mmbase.module.core.MMObjectNode;
19 import org.mmbase.module.corebuilders.RelDef;
20 import org.mmbase.module.corebuilders.TypeDef;
21 import org.mmbase.module.corebuilders.TypeRel;
22 import org.mmbase.util.XMLEntityResolver;
23 import org.mmbase.util.logging.Logger;
24 import org.mmbase.util.logging.Logging;
25 import org.w3c.dom.Element JavaDoc;
26 import org.xml.sax.InputSource JavaDoc;
27
28 /**
29  * DisplayHtmlPackage, Handler for html packages
30  *
31  * @author Daniel Ockeloen (MMBased)
32  */

33 public class CloudModelPackage extends BasicPackage implements PackageInterface {
34
35     private static Logger log = Logging.getLoggerInstance(CloudModelPackage.class);
36
37     /**
38      * DTD resource filename of the cloudmodel DTD version 1.0
39      */

40     public final static String JavaDoc DTD_CLOUDMODEL_1_0 = "cloudmodel_1_0.dtd";
41
42     /**
43      * Public ID of the cloudmodel DTD version 1.0
44      */

45     public final static String JavaDoc PUBLIC_ID_CLOUDMODEL_1_0 = "-//MMBase//DTD cloudmodel config 1.0//EN";
46
47
48     /**
49      * Register the Public Ids for DTDs used by DatabaseReader
50      * This method is called by XMLEntityResolver.
51      */

52     public static void registerPublicIDs() {
53         XMLEntityResolver.registerPublicID(PUBLIC_ID_CLOUDMODEL_1_0, DTD_CLOUDMODEL_1_0, CloudModelPackage.class);
54     }
55
56
57     /**
58      * Description of the Method
59      *
60      * @return Description of the Return Value
61      */

62     public boolean install() {
63         boolean result = true;
64         try {
65
66             // step1
67
installStep step = getNextInstallStep();
68             step.setUserFeedBack("cloud/model installer started");
69
70             setProgressBar(1000);
71             increaseProgressBar(100);
72             // downloading is 10%
73
// step 2
74
step = getNextInstallStep();
75             step.setUserFeedBack("receiving package ..");
76             JarFile JavaDoc jf = getJarFile();
77             if (jf != null) {
78                 step.setUserFeedBack("receiving package ... done (" + jf + ")");
79                 increaseProgressBar(100);
80                 // downloading is 20%
81

82                 // step 3
83
step = getNextInstallStep();
84                 step.setUserFeedBack("checking dependencies ..");
85                 if (dependsInstalled(jf, step)) {
86                     step.setUserFeedBack("checking dependencies ... done");
87                     increaseProgressBar(100);
88                     // downloading is 30%
89

90                     // step 5
91
step = getNextInstallStep();
92                     step.setUserFeedBack("Opening model.xml file ..");
93                     ExtendedDocumentReader reader = getModelReader(jf);
94                     if (reader != null) {
95                         step.setUserFeedBack("Opening model.xml file ... done");
96
97                         step = getNextInstallStep();
98                         step.setUserFeedBack("updating builders..");
99                         increaseProgressBar(100);
100                         // downloading is 40%
101
if (installNeededBuilders(jf, reader, step)) {
102                             step.setUserFeedBack("updating builders... done");
103                             increaseProgressBar(100);
104                             // downloading is 50%
105
} else {
106                             step.setUserFeedBack("updating builders... failed");
107                             step = getNextInstallStep();
108                             step.setUserFeedBack("cloud/model installer ended");
109                             return false;
110                         }
111
112                         step = getNextInstallStep();
113                         step.setUserFeedBack("updating relation defs..");
114                         increaseProgressBar(100);
115                         // downloading is 60%
116
if (installNeededRelDefs(jf, reader, step)) {
117                             step.setUserFeedBack("updating relation defs... done");
118                             increaseProgressBar(100);
119                             // downloading is 70%
120
} else {
121                             step.setUserFeedBack("updating relation defs... failed");
122                             step.setType(installStep.TYPE_ERROR);
123                             step = getNextInstallStep();
124                             step.setUserFeedBack("cloud/model installer ended");
125                             return false;
126                         }
127
128                         increaseProgressBar(100);
129                         // downloading is 80%
130

131                         step = getNextInstallStep();
132                         step.setUserFeedBack("updating allowed relations");
133                         installAllowedRelations(jf, reader, step);
134                         step = getNextInstallStep();
135                         step.setUserFeedBack("updating allowed relations done");
136
137                         increaseProgressBar(100);
138                         // downloading is 90%
139

140                         // step 5
141
step = getNextInstallStep();
142                         step.setUserFeedBack("updating mmbase registry ..");
143                         updateRegistryInstalled();
144                         step.setUserFeedBack("updating mmbase registry ... done");
145                         increaseProgressBar(100);
146                         // downloading is 100%
147
} else {
148                         step.setUserFeedBack("Opening model.xml file ... failed");
149                         step.setType(installStep.TYPE_ERROR);
150                     }
151
152                 } else {
153                     step.setUserFeedBack("checking dependencies ... failed");
154                     step.setType(installStep.TYPE_ERROR);
155                     result = false;
156                 }
157             } else {
158                 step.setUserFeedBack("getting the mmp package...failed (server down or removed disk ? )");
159                 step.setType(installStep.TYPE_ERROR);
160                 try {
161                     Thread.sleep(2000);
162                 } catch(Exception JavaDoc ee) {}
163             }
164
165
166             // step 6
167
step = getNextInstallStep();
168             step.setUserFeedBack("cloud/model installer ended");
169
170         } catch (Exception JavaDoc e) {
171             log.error("install crash on : " + this);
172             result = false;
173         }
174         return result;
175     }
176
177
178     /**
179      * Description of the Method
180      *
181      * @return Description of the Return Value
182      */

183     public boolean uninstall() {
184         try {
185
186             // step1
187
installStep step = getNextInstallStep();
188             step.setUserFeedBack("cloud/model uninstaller started");
189
190             // step 3
191
step = getNextInstallStep();
192             step.setUserFeedBack("updating mmbase registry ..");
193             updateRegistryUninstalled();
194             step.setUserFeedBack("updating mmbase registry ... done");
195
196             // step 4
197
step = getNextInstallStep();
198             step.setUserFeedBack("cloud/model installer ended");
199
200         } catch (Exception JavaDoc e) {
201             log.error("install crash on : " + this);
202         }
203         return true;
204     }
205
206
207
208     /**
209      * Description of the Method
210      *
211      * @param jf Description of the Parameter
212      * @param reader Description of the Parameter
213      * @param step Description of the Parameter
214      * @return Description of the Return Value
215      */

216     private boolean installNeededRelDefs(JarFile JavaDoc jf, ExtendedDocumentReader reader, installStep step) {
217         MMBase mmb = MMBase.getMMBase();
218         for (Iterator JavaDoc ns = reader.getChildElements("cloudmodel.neededreldeflist", "reldef");
219                 ns.hasNext(); ) {
220             Element JavaDoc n = (Element JavaDoc) ns.next();
221             String JavaDoc buildername = n.getAttribute("builder");
222             String JavaDoc source = n.getAttribute("source");
223             String JavaDoc target = n.getAttribute("target");
224             String JavaDoc direction = n.getAttribute("direction");
225             String JavaDoc guisourcename = n.getAttribute("guisourcename");
226             String JavaDoc guitargetname = n.getAttribute("guitargetname");
227
228             // retrieve builder info
229
int builder = -1;
230             if (RelDef.usesbuilder) {
231                 // if no 'builder' attribute is present (old format), use source name as builder name
232
if (buildername == null) {
233                     buildername = source;
234                 }
235
236                 builder = mmb.getTypeDef().getIntValue(buildername);
237             }
238             // is not explicitly set to unidirectional, direction is assumed to be bidirectional
239
if ("unidirectional".equals(direction)) {
240                 if (!installRelDef(source, target, 1, guisourcename, guitargetname, builder, step)) {
241                     return false;
242                 }
243             } else {
244                 if (!installRelDef(source, target, 2, guisourcename, guitargetname, builder, step)) {
245                     return false;
246                 }
247             }
248
249         }
250         return true;
251     }
252
253
254     /**
255      * Description of the Method
256      *
257      * @param jf Description of the Parameter
258      * @param reader Description of the Parameter
259      * @param step Description of the Parameter
260      * @return Description of the Return Value
261      */

262     private boolean installAllowedRelations(JarFile JavaDoc jf, ExtendedDocumentReader reader, installStep step) {
263         for (Iterator JavaDoc ns = reader.getChildElements("cloudmodel.allowedrelationlist", "relation");
264                 ns.hasNext(); ) {
265             Element JavaDoc n = (Element JavaDoc) ns.next();
266             String JavaDoc from = n.getAttribute("from");
267             String JavaDoc to = n.getAttribute("to");
268             String JavaDoc type = n.getAttribute("type");
269
270             installStep substep = step.getNextInstallStep();
271             substep.setUserFeedBack("checking allowed relation " + from + " " + to + " " + type + "..");
272             if (getBundleStep()!=null) getBundleStep().setUserFeedBack("calling package installer "+getName()+".. allowed relation " + from + " " + to + " " + type);
273             if (installTypeRel(from, to, type, -1)) {
274                 substep.setUserFeedBack("checking allowed relation " + from + " " + to + " " + type + ".. installed");
275             } else {
276                 substep.setUserFeedBack("checking allowed relation " + from + " " + to + " " + type + ".. failed");
277                 substep.setType(installStep.TYPE_ERROR);
278             }
279         }
280         return true;
281     }
282
283
284     /**
285      * Description of the Method
286      *
287      * @param jf Description of the Parameter
288      * @param reader Description of the Parameter
289      * @param step Description of the Parameter
290      * @return Description of the Return Value
291      */

292     private boolean installNeededBuilders(JarFile JavaDoc jf, ExtendedDocumentReader reader, installStep step) {
293         for (Iterator JavaDoc ns = reader.getChildElements("cloudmodel.neededbuilderlist", "builder");
294                 ns.hasNext(); ) {
295             Element JavaDoc n3 = (Element JavaDoc) ns.next();
296
297             String JavaDoc name = reader.getElementValue(n3);
298
299             installStep substep = step.getNextInstallStep();
300             substep.setUserFeedBack("checking builder " + name + " ..");
301             if (getBundleStep()!=null) getBundleStep().setUserFeedBack("calling package installer "+getName()+"..checking builder "+ name);
302
303             MMBase mmb = MMBase.getMMBase();
304
305             MMObjectBuilder bul = mmb.getMMObject(name);
306             // if builder not loaded
307
if (bul == null) {
308                 // if 'inactive' in the config/builder path, fail
309
String JavaDoc path = mmb.getBuilderPath(name, "");
310                 if (path != null) {
311                     substep.setUserFeedBack("checking builder " + name + " .. failed, builder on system but not active. Please turn the builder on in xml file");
312                     substep.setType(installStep.TYPE_ERROR);
313                     continue;
314                 }
315
316                 // check the presence of typedef (if not present, fail)
317
MMObjectBuilder objectTypes = mmb.getTypeDef();
318                 if (objectTypes == null) {
319                     substep.setUserFeedBack("checking builder " + name + " .. failed, could not find the typedef builder.");
320                     substep.setType(installStep.TYPE_ERROR);
321                     return false;
322                 }
323                 // try to add a node to typedef, same as adding a builder...
324
MMObjectNode type = objectTypes.getNewNode("system");
325                 // fill the name....
326
type.setValue("name", name);
327
328                 // fill the config...
329
JarEntry JavaDoc je = jf.getJarEntry("builders/" + name + ".xml");
330                 if (je == null) je = jf.getJarEntry("builders\\" + name + ".xml");
331                 try {
332                     InputStream JavaDoc input = jf.getInputStream(je);
333
334                     org.w3c.dom.Document JavaDoc config = null;
335                     try {
336                         config = ExtendedDocumentReader.getDocumentBuilder(ExtendedDocumentReader.class).parse(new InputSource JavaDoc(input));
337                     } catch (org.xml.sax.SAXException JavaDoc se) {
338                         substep.setUserFeedBack("checking builder " + name + " .. failed,A XML parsing error occurred (" + se.toString() + "). Check the log for details.");
339                         substep.setType(installStep.TYPE_ERROR);
340                         return false;
341                     } catch (java.io.IOException JavaDoc ioe) {
342                         substep.setUserFeedBack("checking builder " + name + " .. failed,A file I/O error occurred (" + ioe.toString() + "). Check the log for details.");
343                         substep.setType(installStep.TYPE_ERROR);
344                         return false;
345                     }
346                     type.setValue("config", config);
347
348                 } catch (Exception JavaDoc e) {
349                     substep.setUserFeedBack("checking builder " + name + " .. failed, can't open builder.xml in cloudmodel jar");
350                     substep.setType(installStep.TYPE_ERROR);
351                     return false;
352                 }
353                 // insert into mmbase
354
try {
355                     objectTypes.insert("system", type);
356                 } catch (Exception JavaDoc e) {
357                     e.printStackTrace();
358                 }
359                 // we now made the builder active.. look for other builders...
360
substep.setUserFeedBack("checking builder " + name + " ...installed");
361             } else {
362                 substep.setUserFeedBack("checking builder " + name + " ...allready installed");
363                 substep.setType(installStep.TYPE_WARNING);
364             }
365
366         }
367         return true;
368     }
369
370
371     /**
372      * Gets the modelReader attribute of the CloudModelPackage object
373      *
374      * @param jf Description of the Parameter
375      * @return The modelReader value
376      */

377     private ExtendedDocumentReader getModelReader(JarFile JavaDoc jf) {
378         try {
379             JarEntry JavaDoc je = jf.getJarEntry("model.xml");
380             if (je != null) {
381                 InputStream JavaDoc input = jf.getInputStream(je);
382                 ExtendedDocumentReader reader = new ExtendedDocumentReader(new InputSource JavaDoc(input), CloudModelPackage.class);
383                 if (reader != null) {
384                     return reader;
385                 }
386             }
387         } catch (Exception JavaDoc e) {
388             log.error("problem opending model.xml file");
389         }
390         return null;
391     }
392
393
394
395     /**
396      * Checks whether a given relation definition exists, and if not, creates that definition.
397      *
398      * @param sname source name of the relation definition
399      * @param dname destination name of the relation definition
400      * @param dir directionality (uni or bi)
401      * @param sguiname source GUI name of the relation definition
402      * @param dguiname destination GUI name of the relation definition
403      * @param builder references the builder to use (only in new format)
404      * @param step Description of the Parameter
405      * @return <code>true</code> if succesfull, <code>false</code> if an error occurred
406      */

407     private boolean installRelDef(String JavaDoc sname, String JavaDoc dname, int dir, String JavaDoc sguiname, String JavaDoc dguiname, int builder, installStep step) {
408         MMBase mmb = MMBase.getMMBase();
409         RelDef reldef = mmb.getRelDef();
410         if (reldef != null) {
411             installStep substep = step.getNextInstallStep();
412             substep.setUserFeedBack("checking reldef " + sname + "/" + dname + " ..");
413             if (getBundleStep()!=null) getBundleStep().setUserFeedBack("calling package installer "+getName()+"..checking reldef " + sname + "/" + dname + " ..");
414             if (reldef.getNumberByName(sname + "/" + dname) == -1) {
415                 MMObjectNode node = reldef.getNewNode("system");
416                 node.setValue("sname", sname);
417                 node.setValue("dname", dname);
418                 node.setValue("dir", dir);
419                 node.setValue("sguiname", sguiname);
420                 node.setValue("dguiname", dguiname);
421                 if (RelDef.usesbuilder) {
422                     // if builder is unknown (falsely specified), use the InsRel builder
423
if (builder <= 0) {
424                         builder = mmb.getInsRel().getNumber();
425                     }
426                     node.setValue("builder", builder);
427                 }
428                 int id = reldef.insert("system", node);
429                 if (id != -1) {
430                     substep.setUserFeedBack("checking reldef " + sname + "/" + dname + " ..installed");
431                 } else {
432                     substep.setUserFeedBack("checking reldef " + sname + "/" + dname + " .. not installed");
433                     substep.setType(installStep.TYPE_ERROR);
434                     return false;
435                 }
436             } else {
437                 substep.setUserFeedBack("checking reldef " + sname + "/" + dname + " .. allready installed");
438                 substep.setType(installStep.TYPE_WARNING);
439             }
440         } else {
441             installStep substep = step.getNextInstallStep();
442             substep.setUserFeedBack("Can't use reldef !");
443             substep.setType(installStep.TYPE_ERROR);
444             return false;
445         }
446         return true;
447     }
448
449
450
451     /**
452      * Checks and if required installs an allowed type relation (typerel object).
453      *
454      * @param sname source type name of the type relation
455      * @param dname destination type name of the type relation
456      * @param rname role name of the type relation
457      * @param count cardinality of the type relation
458      * @return <code>true</code> if succesfull, <code>false</code> if an error occurred
459      */

460     private boolean installTypeRel(String JavaDoc sname, String JavaDoc dname, String JavaDoc rname, int count) {
461         MMBase mmb = MMBase.getMMBase();
462         TypeRel typerel = mmb.getTypeRel();
463         if (typerel != null) {
464             TypeDef typedef = mmb.getTypeDef();
465             if (typedef == null) {
466                 //return result.error("Can't get typedef builder");
467
return false;
468             }
469             RelDef reldef = mmb.getRelDef();
470             if (reldef == null) {
471                 //return result.error("Can't get reldef builder");
472
return false;
473             }
474
475             // figure out rnumber
476
int rnumber = reldef.getNumberByName(rname);
477             if (rnumber == -1) {
478                 //return result.error("No reldef with role '"+rname+"' defined");
479
return false;
480             }
481
482             // figure out snumber
483
int snumber = typedef.getIntValue(sname);
484             if (snumber == -1) {
485                 //return result.error("No builder with name '"+sname+"' defined");
486
return false;
487             }
488
489             // figure out dnumber
490
int dnumber = typedef.getIntValue(dname);
491             if (dnumber == -1) {
492                 //return result.error("No builder with name '"+dname+"' defined");
493
return false;
494             }
495
496             if (!typerel.contains(snumber, dnumber, rnumber, TypeRel.STRICT)) {
497                 MMObjectNode node = typerel.getNewNode("system");
498                 node.setValue("snumber", snumber);
499                 node.setValue("dnumber", dnumber);
500                 node.setValue("rnumber", rnumber);
501                 node.setValue("max", count);
502                 int id = typerel.insert("system", node);
503                 if (id != -1) {
504                     log.debug("TypeRel (" + sname + "," + dname + "," + rname + ") installed");
505                 } else {
506                     //return result.error("TypeRel ("+sname+","+dname+","+rname+") could not be installed");
507
return false;
508                 }
509             }
510             return true;
511         } else {
512             //return result.error("Can't get typerel builder");
513
return false;
514         }
515     }
516
517 }
518
519
Popular Tags