KickJava   Java API By Example, From Geeks To Geeks.

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


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.DataInputStream JavaDoc;
10 import java.io.InputStream JavaDoc;
11 import java.util.Enumeration JavaDoc;
12 import java.util.Iterator JavaDoc;
13 import java.util.Collection JavaDoc;
14 import java.util.jar.JarEntry JavaDoc;
15 import java.util.jar.JarFile JavaDoc;
16
17 import org.mmbase.applications.packaging.installhandlers.installStep;
18 import org.mmbase.applications.packaging.util.ExtendedDocumentReader;
19 import org.mmbase.bridge.Field;
20 import org.mmbase.module.core.MMBase;
21 import org.mmbase.module.core.MMObjectBuilder;
22 import org.mmbase.module.core.MMObjectNode;
23 import org.mmbase.core.CoreField;
24 import org.mmbase.module.corebuilders.InsRel;
25 import org.mmbase.module.corebuilders.RelDef;
26 import org.mmbase.util.XMLEntityResolver;
27 import org.mmbase.util.logging.Logger;
28 import org.mmbase.util.logging.Logging;
29 import org.w3c.dom.Element JavaDoc;
30 import org.xml.sax.InputSource JavaDoc;
31
32 /**
33  *
34  * @author Daniel Ockeloen (MMBased)
35  */

36 public class DataApps1Package extends BasicPackage implements PackageInterface {
37
38     private static final Logger log = Logging.getLoggerInstance(DataApps1Package.class);
39
40     /**
41      * Description of the Field
42      */

43     public final static String JavaDoc DTD_DATASET_1_0 = "dataset_1_0.dtd";
44     /**
45      * Description of the Field
46      */

47     public final static String JavaDoc DTD_OBJECTSET_1_0 = "objectset_1_0.dtd";
48     /**
49      * Description of the Field
50      */

51     public final static String JavaDoc DTD_RELATIONSET_1_0 = "relationset_1_0.dtd";
52
53     /**
54      * Description of the Field
55      */

56     public final static String JavaDoc PUBLIC_ID_DATASET_1_0 = "-//MMBase//DTD dataset config 1.0//EN";
57     /**
58      * Description of the Field
59      */

60     public final static String JavaDoc PUBLIC_ID_OBJECTSET_1_0 = "-//MMBase//DTD objectset config 1.0//EN";
61     /**
62      * Description of the Field
63      */

64     public final static String JavaDoc PUBLIC_ID_RELATIONSET_1_0 = "-//MMBase//DTD relationset config 1.0//EN";
65
66
67     /**
68      * Register the Public Ids for DTDs used by DatabaseReader
69      * This method is called by XMLEntityResolver.
70      */

71     public static void registerPublicIDs() {
72         XMLEntityResolver.registerPublicID(PUBLIC_ID_DATASET_1_0, DTD_DATASET_1_0, DataApps1Package.class);
73         XMLEntityResolver.registerPublicID(PUBLIC_ID_OBJECTSET_1_0, DTD_OBJECTSET_1_0, DataApps1Package.class);
74         XMLEntityResolver.registerPublicID(PUBLIC_ID_RELATIONSET_1_0, DTD_RELATIONSET_1_0, DataApps1Package.class);
75     }
76
77
78     /**
79      * Description of the Method
80      *
81      * @return Description of the Return Value
82      */

83     public boolean install() {
84         try {
85
86             // step1
87
installStep step = getNextInstallStep();
88             step.setUserFeedBack("data/apps1 installer started");
89
90             // step 2
91
step = getNextInstallStep();
92             step.setUserFeedBack("receiving package ..");
93             setProgressBar(1000);
94             // lets have 100 steps;
95

96             JarFile JavaDoc jf = getJarFile();
97             if (jf != null) {
98                 step.setUserFeedBack("receiving package ... done (" + jf + ")");
99                 increaseProgressBar(100);
100                 // downloading is 10%
101

102                 // step 3
103
step = getNextInstallStep();
104                 step.setUserFeedBack("checking dependencies ..");
105
106                 if (dependsInstalled(jf, step)) {
107                     increaseProgressBar(100);
108                     // 20%
109

110                     step.setUserFeedBack("checking dependencies ... done");
111
112                     // step 4
113
step = getNextInstallStep();
114                     step.setUserFeedBack("loading datasets ..");
115                     if (installDataSets(jf, step)) {
116                         step.setUserFeedBack("loading datasets ... done");
117                     } else {
118                         step.setUserFeedBack("loading datasets ... failed");
119                     }
120                     increaseProgressBar(200);
121                     // 70%
122

123                     // step 5
124
step = getNextInstallStep();
125                     step.setUserFeedBack("updating mmbase registry ..");
126                     updateRegistryInstalled();
127                     increaseProgressBar(100);
128                     // 90%
129
step.setUserFeedBack("updating mmbase registry ... done");
130
131                 } else {
132                     step.setUserFeedBack("checking dependencies ... failed");
133                     setState("failed");
134                     return false;
135                 }
136             } else {
137                 step.setUserFeedBack("getting the mmp package...failed (server down or removed disk ? )");
138                 step.setType(installStep.TYPE_ERROR);
139                 try {
140                     Thread.sleep(2000);
141                 } catch(Exception JavaDoc ee) {}
142             }
143
144
145             increaseProgressBar(100);
146             // 100%
147
// step 6
148
step = getNextInstallStep();
149             step.setUserFeedBack("data/apps1 installer ended");
150
151         } catch (Exception JavaDoc e) {
152             log.error("install crash on : " + this);
153         }
154         return true;
155     }
156
157
158     /**
159      * Description of the Method
160      *
161      * @return Description of the Return Value
162      */

163     public boolean uninstall() {
164         try {
165
166             // step1
167
installStep step = getNextInstallStep();
168             step.setUserFeedBack("data/apps1 uninstaller started");
169
170             // step 3
171
step = getNextInstallStep();
172             step.setUserFeedBack("updating mmbase registry ..");
173             updateRegistryUninstalled();
174             step.setUserFeedBack("updating mmbase registry ... done");
175
176             // step 4
177
step = getNextInstallStep();
178             step.setUserFeedBack("data/apps1 installer ended");
179
180         } catch (Exception JavaDoc e) {
181             log.error("install crash on : " + this);
182         }
183         return true;
184     }
185
186
187     /**
188      * Description of the Method
189      *
190      * @param jf Description of the Parameter
191      * @param step Description of the Parameter
192      * @return Description of the Return Value
193      */

194     private boolean installDataSets(JarFile JavaDoc jf, installStep step) {
195         MMBase mmb = MMBase.getMMBase();
196         installStep substep = step.getNextInstallStep();
197         substep.setUserFeedBack("Opening data.xml ..");
198         increaseProgressBar(100);
199         // 30%
200
try {
201             JarEntry JavaDoc je = jf.getJarEntry("data.xml");
202             if (je != null) {
203                 InputStream JavaDoc input = jf.getInputStream(je);
204                 ExtendedDocumentReader reader = new ExtendedDocumentReader(new InputSource JavaDoc(input), DataApps1Package.class);
205                 substep.setUserFeedBack("Opening data.xml ... done");
206                 increaseProgressBar(100);
207                 // 40%
208
for (Iterator JavaDoc ns = reader.getChildElements("dataset.objectsets", "objectset"); ns.hasNext(); ) {
209                     Element JavaDoc n = (Element JavaDoc) ns.next();
210                     String JavaDoc path = n.getAttribute("path");
211                     substep = step.getNextInstallStep();
212                     substep.setUserFeedBack("loading objects " + path + "..");
213                     if (installObjectSet(jf, path)) {
214                         substep.setUserFeedBack("loading objects " + path + "... done ");
215                     } else {
216                         substep.setUserFeedBack("loading objects " + path + "... failed, see logfile what happend");
217                         step.setType(installStep.TYPE_ERROR);
218                         return false;
219                     }
220
221                 }
222                 increaseProgressBar(100);
223                 // 50%
224
for (Iterator JavaDoc ns = reader.getChildElements("dataset.relationsets", "relationset"); ns.hasNext(); ) {
225                     Element JavaDoc n = (Element JavaDoc) ns.next();
226                     String JavaDoc name = n.getAttribute("name");
227                     String JavaDoc path = n.getAttribute("path");
228                     installRelationSet(jf, path);
229
230                 }
231             }
232         } catch (Exception JavaDoc e) {
233             substep.setUserFeedBack("Opening data.xml ... failed");
234             substep.setType(installStep.TYPE_ERROR);
235             log.error("problem opending data.xml file");
236         }
237         increaseProgressBar(100);
238         // 60%
239
return true;
240     }
241
242
243
244     /**
245      * @param jf Description of the Parameter
246      * @param path Description of the Parameter
247      * @return Description of the Return Value
248      * @javadoc
249      */

250     private boolean installObjectSet(JarFile JavaDoc jf, String JavaDoc path) {
251         MMBase mmb = MMBase.getMMBase();
252         MMObjectBuilder syncbul = mmb.getMMObject("syncnodes");
253         if (syncbul != null) {
254             JarEntry JavaDoc je = jf.getJarEntry(path);
255         if (je == null) {
256         if (path.indexOf('/') != -1 ) {
257             path.replace('/','\\');
258         }
259         if (path.indexOf('\\') != -1 ) {
260             path.replace('\\','/');
261         }
262                 je = jf.getJarEntry(path);
263         }
264             if (je != null) {
265                 try {
266                     InputStream JavaDoc input = jf.getInputStream(je);
267                     ExtendedDocumentReader nodereader = new ExtendedDocumentReader(new InputSource JavaDoc(input), DataApps1Package.class);
268                     Element JavaDoc nr = nodereader.getElementByPath("objectset");
269                     String JavaDoc type = nr.getAttribute("type");
270                     String JavaDoc exportsource = nr.getAttribute("exportsource");
271                     installStep step = getNextInstallStep();
272                     step.setUserFeedBack("installing dataset : " + type + " ..");
273                     int timestamp = -1;
274                     try {
275                         timestamp = Integer.parseInt(nr.getAttribute("timestamp"));
276                     } catch (Exception JavaDoc e) {}
277                     for (Iterator JavaDoc ns = nodereader.getChildElements("objectset", "object");
278                             ns.hasNext(); ) {
279                         Element JavaDoc n = (Element JavaDoc) ns.next();
280                         String JavaDoc exportnumber = n.getAttribute("number");
281                         MMObjectBuilder bul = mmb.getMMObject(type);
282                         String JavaDoc query = "exportnumber==" + exportnumber + "+exportsource=='" + exportsource + "'";
283                         Enumeration JavaDoc b = syncbul.search(query);
284                         if (b.hasMoreElements()) {
285                             MMObjectNode syncnode = (MMObjectNode) b.nextElement();
286                             log.info("node allready installed : " + exportnumber);
287                         } else {
288                             log.info("node installing !! : " + exportnumber);
289                             MMObjectNode loadednode = createNewObject(nodereader, bul, n, jf);
290                             MMObjectNode localnode = getExistingContentNode(loadednode, bul);
291                             if (localnode == null) {
292                                 int localnumber = loadednode.insert(loadednode.getStringValue("owner"));
293                                 MMObjectNode syncnode = syncbul.getNewNode("import");
294                                 syncnode.setValue("exportsource", exportsource);
295                                 syncnode.setValue("exportnumber", exportnumber);
296                                 syncnode.setValue("timestamp", timestamp);
297                                 syncnode.setValue("localnumber", localnumber);
298                                 syncnode.insert("import");
299                             } else {
300                                 MMObjectNode syncnode = syncbul.getNewNode("import");
301                                 syncnode.setValue("exportsource", exportsource);
302                                 syncnode.setValue("exportnumber", exportnumber);
303                                 syncnode.setValue("timestamp", timestamp);
304                                 syncnode.setValue("localnumber", localnode.getNumber());
305                                 syncnode.insert("import");
306                             }
307                         }
308                     }
309                     step.setUserFeedBack("installing objectset : " + type + " ...done");
310                 } catch (Exception JavaDoc e) {
311                     log.error("can't read node xml from jar file");
312                     e.printStackTrace();
313                     return false;
314                 }
315             }
316             return true;
317         } else {
318             return false;
319         }
320     }
321
322
323     /**
324      * Description of the Method
325      *
326      * @param nodereader Description of the Parameter
327      * @param bul Description of the Parameter
328      * @param n Description of the Parameter
329      * @param jf Description of the Parameter
330      * @return Description of the Return Value
331      */

332     private MMObjectNode createNewObject(ExtendedDocumentReader nodereader, MMObjectBuilder bul, Element JavaDoc n, JarFile JavaDoc jf) {
333         String JavaDoc owner = n.getAttribute("owner");
334         String JavaDoc alias = n.getAttribute("alias");
335
336         if (owner == null) {
337             owner = "import";
338         }
339         MMObjectNode newnode = bul.getNewNode(owner);
340         if (alias != null) {
341             newnode.setAlias(alias);
342         }
343
344         for (Iterator JavaDoc ns2 = nodereader.getChildElements(n, "field");
345                 ns2.hasNext(); ) {
346             Element JavaDoc n2 = (Element JavaDoc) ns2.next();
347             String JavaDoc field = n2.getAttribute("name");
348             org.w3c.dom.Node JavaDoc n3 = n2.getFirstChild();
349             String JavaDoc value = null;
350             if (n3 != null) {
351                 value = n3.getNodeValue();
352             }
353
354             int type = bul.getDBType(field);
355             if (type != -1) {
356                 if (type == Field.TYPE_STRING || type == Field.TYPE_XML) {
357                     if (value == null) {
358                         value = "";
359                     }
360                     newnode.setValue(field, value);
361                 } else if (type == Field.TYPE_NODE) {
362                     try {
363                         newnode.setValue(field, Integer.parseInt(value));
364                     } catch (Exception JavaDoc e) {
365                         log.warn("error setting node-field " + e);
366                         newnode.setValue(field, -1);
367                     }
368                 } else if (type == Field.TYPE_INTEGER) {
369                     try {
370                         newnode.setValue(field, Integer.parseInt(value));
371                     } catch (Exception JavaDoc e) {
372                         log.warn("error setting integer-field " + e);
373                         newnode.setValue(field, -1);
374                     }
375                 } else if (type == Field.TYPE_FLOAT) {
376                     try {
377                         newnode.setValue(field, Float.parseFloat(value));
378                     } catch (Exception JavaDoc e) {
379                         log.warn("error setting float-field " + e);
380                         newnode.setValue(field, -1);
381                     }
382                 } else if (type == Field.TYPE_DOUBLE) {
383                     try {
384                         newnode.setValue(field, Double.parseDouble(value));
385                     } catch (Exception JavaDoc e) {
386                         log.warn("error setting double-field " + e);
387                         newnode.setValue(field, -1);
388                     }
389                 } else if (type == Field.TYPE_LONG) {
390                     try {
391                         newnode.setValue(field, Long.parseLong(value));
392                     } catch (Exception JavaDoc e) {
393                         log.warn("error setting long-field " + e);
394                         newnode.setValue(field, -1);
395                     }
396                 } else if (type == Field.TYPE_BYTE) {
397                     String JavaDoc filename = n2.getAttribute("file");
398                     JarEntry JavaDoc je = jf.getJarEntry("data/" + filename);
399                     if (je != null) {
400                         int buffersize = (int) je.getSize();
401                         byte[] buffer = new byte[buffersize];
402                         try {
403                             DataInputStream JavaDoc in = new DataInputStream JavaDoc(jf.getInputStream(je));
404                             in.readFully(buffer, 0, buffersize);
405                         } catch (Exception JavaDoc e) {
406                             log.error("Jar file (handle) read error");
407                             e.printStackTrace();
408                         }
409                         newnode.setValue(field, buffer);
410                     }
411                 } else {
412                     log.error("FieldDefs not found for #" + type + " was not known for field with name: '" + field + "' and with value: '" + value + "'");
413                 }
414             }
415         }
416         return newnode;
417     }
418
419
420     /**
421      * @param newnode Description of the Parameter
422      * @param bul Description of the Parameter
423      * @return The existingContentNode value
424      * @javadoc
425      */

426     private MMObjectNode getExistingContentNode(MMObjectNode newnode, MMObjectBuilder bul) {
427         String JavaDoc checkQ = "";
428         Collection JavaDoc vec = bul.getFields();
429         for (Iterator JavaDoc h = vec.iterator(); h.hasNext(); ) {
430             CoreField def = (CoreField) h.next();
431             if (def.isUnique()) {
432                 int type = def.getType();
433                 String JavaDoc name = def.getName();
434                 if (type == Field.TYPE_STRING) {
435                     String JavaDoc value = newnode.getStringValue(name);
436                     if (checkQ.equals("")) {
437                         checkQ += name + "=='" + value + "'";
438                     } else {
439                         checkQ += "+" + name + "=='" + value + "'";
440                     }
441                 }
442             }
443         }
444         if (!checkQ.equals("")) {
445             Enumeration JavaDoc r = bul.search(checkQ);
446             if (r.hasMoreElements()) {
447                 MMObjectNode oldnode = (MMObjectNode) r.nextElement();
448                 return oldnode;
449             }
450         }
451         return null;
452     }
453
454
455     /**
456      * @param jf Description of the Parameter
457      * @param path Description of the Parameter
458      * @return Description of the Return Value
459      * @javadoc
460      */

461     private boolean installRelationSet(JarFile JavaDoc jf, String JavaDoc path) {
462         MMBase mmb = MMBase.getMMBase();
463         RelDef reldef = mmb.getRelDef();
464         MMObjectBuilder syncbul = mmb.getMMObject("syncnodes");
465         if (syncbul != null) {
466             JarEntry JavaDoc je = jf.getJarEntry(path);
467             if (je != null) {
468                 try {
469                     InputStream JavaDoc input = jf.getInputStream(je);
470                     ExtendedDocumentReader nodereader = new ExtendedDocumentReader(new InputSource JavaDoc(input), DataApps1Package.class);
471                     Element JavaDoc nr = nodereader.getElementByPath("relationset");
472                     String JavaDoc type = nr.getAttribute("type");
473                     String JavaDoc exportsource = nr.getAttribute("exportsource");
474                     installStep step = getNextInstallStep();
475                     step.setUserFeedBack("installing relationset : " + type + " ..");
476                     int timestamp = -1;
477                     try {
478                         timestamp = Integer.parseInt(nr.getAttribute("timestamp"));
479                     } catch (Exception JavaDoc e) {}
480                     for (Iterator JavaDoc ns = nodereader.getChildElements("relationset", "relation");
481                             ns.hasNext(); ) {
482                         Element JavaDoc n = (Element JavaDoc) ns.next();
483                         String JavaDoc exportnumber = n.getAttribute("number");
484                         String JavaDoc snumber = n.getAttribute("snumber");
485                         String JavaDoc dnumber = n.getAttribute("dnumber");
486                         String JavaDoc rtype = n.getAttribute("rtype");
487                         String JavaDoc dir = n.getAttribute("dir");
488
489                         MMObjectBuilder bul = mmb.getMMObject(type);
490
491                         Enumeration JavaDoc b = syncbul.search("exportnumber==" + exportnumber + "+exportsource=='" + exportsource + "'");
492                         if (b.hasMoreElements()) {
493                             MMObjectNode syncnode = (MMObjectNode) b.nextElement();
494                             log.debug("relation allready installed : " + exportnumber);
495                         } else {
496                             MMObjectNode loadednode = createNewObject(nodereader, bul, n, jf);
497                             // find snumber
498
b = syncbul.search("exportnumber==" + snumber + "+exportsource=='" + exportsource + "'");
499                             int realsnumber = -1;
500                             if (b.hasMoreElements()) {
501                                 MMObjectNode n2 = (MMObjectNode) b.nextElement();
502                                 realsnumber = n2.getIntValue("localnumber");
503                             }
504
505                             // find dnumber
506
int realdnumber = -1;
507                             b = syncbul.search("exportnumber==" + dnumber + "+exportsource=='" + exportsource + "'");
508                             if (b.hasMoreElements()) {
509                                 MMObjectNode n2 = (MMObjectNode) b.nextElement();
510                                 realdnumber = n2.getIntValue("localnumber");
511                             }
512
513                             // figure out rnumber
514
int realrnumber = reldef.getNumberByName(rtype);
515                             // directionality
516
if (InsRel.usesdir) {
517                                 int realdir = 0;
518                                 if (dir != null) {
519                                     if ("unidirectional".equals(dir)) {
520                                         realdir = 1;
521                                     } else if ("bidirectional".equals(dir)) {
522                                         realdir = 2;
523                                     } else {
524                                         log.error("invalid 'dir' attribute encountered in " + bul.getTableName() + " value=" + dir);
525                                     }
526                                 }
527                                 if (realdir == 0) {
528                                     MMObjectNode relnode = reldef.getNode(realrnumber);
529                                     if (relnode != null) {
530                                         realdir = relnode.getIntValue("dir");
531                                     }
532                                 }
533                                 if (realdir != 1) {
534                                     realdir = 2;
535                                 }
536                                 loadednode.setValue("dir", realdir);
537                             }
538
539                             loadednode.setValue("snumber", realsnumber);
540                             loadednode.setValue("dnumber", realdnumber);
541                             loadednode.setValue("rnumber", realrnumber);
542
543                             int localnumber = -1;
544                             if (realsnumber != -1 && realdnumber != -1) {
545                                 localnumber = loadednode.insert(loadednode.getStringValue("admin"));
546                                 if (localnumber != -1) {
547                                     MMObjectNode syncnode = syncbul.getNewNode("import");
548                                     syncnode.setValue("exportsource", exportsource);
549                                     syncnode.setValue("exportnumber", exportnumber);
550                                     syncnode.setValue("timestamp", timestamp);
551                                     syncnode.setValue("localnumber", localnumber);
552                                     syncnode.insert("import");
553                                 }
554                             } else {
555                                 log.error("Cannot sync relation (exportnumber==" + exportnumber + ", snumber:" + snumber + ", dnumber:" + dnumber + ")");
556                             }
557                         }
558                     }
559                     step.setUserFeedBack("installing relationset : " + type + " ...done");
560                 } catch (Exception JavaDoc e) {
561                     log.error("can't read node xml from jar file");
562                     e.printStackTrace();
563                     return false;
564                 }
565             }
566             return true;
567         } else {
568             return false;
569         }
570     }
571
572 }
573
574
Popular Tags