KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > applications > packaging > projects > creators > BundleBasicCreator


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

10
11 package org.mmbase.applications.packaging.projects.creators;
12
13 import java.io.File JavaDoc;
14 import java.io.FileOutputStream JavaDoc;
15 import java.util.ArrayList JavaDoc;
16 import java.util.Date JavaDoc;
17 import java.util.Iterator JavaDoc;
18 import java.util.jar.JarEntry JavaDoc;
19 import java.util.jar.JarFile JavaDoc;
20 import java.util.jar.JarOutputStream JavaDoc;
21 import java.util.jar.Manifest JavaDoc;
22
23 import org.mmbase.applications.packaging.PackageManager;
24 import org.mmbase.applications.packaging.ProviderManager;
25 import org.mmbase.applications.packaging.packagehandlers.PackageInterface;
26 import org.mmbase.applications.packaging.projects.IncludedPackage;
27 import org.mmbase.applications.packaging.projects.Target;
28 import org.mmbase.applications.packaging.projects.packageStep;
29 import org.mmbase.applications.packaging.util.ExtendedDocumentReader;
30 import org.mmbase.util.XMLEntityResolver;
31 import org.mmbase.util.logging.Logger;
32 import org.mmbase.util.logging.Logging;
33 import org.w3c.dom.NamedNodeMap JavaDoc;
34
35 /**
36  * BundleBasicCreator, Handler for basic bundles
37  *
38  * @author Daniel Ockeloen (MMBased)
39  */

40 public class BundleBasicCreator extends BasicCreator implements CreatorInterface {
41
42     private static Logger log = Logging.getLoggerInstance(BundleBasicCreator.class);
43
44     public static final String JavaDoc DTD_PACKAGING_BUNDLE_BASIC_1_0 = "packaging_bundle_basic_1_0.dtd";
45     public static final String JavaDoc PUBLIC_ID_PACKAGING_BUNDLE_BASIC_1_0 = "-//MMBase//DTD packaging_bundle_basic config 1.0//EN";
46
47     public static void registerPublicIDs() {
48         XMLEntityResolver.registerPublicID(PUBLIC_ID_PACKAGING_BUNDLE_BASIC_1_0, "DTD_PACKAGING_BUNDLE_BASIC_1_0", BundleBasicCreator.class); }
49
50     public BundleBasicCreator() {
51         cl=BundleBasicCreator.class;
52     prefix="packaging_bundle_basic";
53     }
54
55
56    public boolean createPackage(Target target,int newversion) {
57
58     clearPackageSteps();
59     // set the size of both bars on 1000 steps
60
setProgressBar(1000);
61
62         // step1
63
packageStep step=getNextPackageStep();
64         step.setUserFeedBack("bundle/basic packager started");
65
66     // set to 5%
67
increaseProgressBar(50);
68
69     // lets first see if we need to create related targets
70
setSubProgressBar(relatedtargetcreate.size());
71         for (Iterator JavaDoc i = relatedtargetcreate.iterator(); i.hasNext();) {
72         Target rt = (Target)i.next();
73         // tricky should be make last version based on local number
74
// or remote number, both ways now until i decide.
75
int nv=rt.getNextVersion();
76         PackageInterface p = PackageManager.getPackage(rt.getId());
77         if (p != null) {
78             try {
79                 int t=Integer.parseInt(p.getVersion());
80                 if (t >= nv) nv = t+1;
81             } catch(Exception JavaDoc e) {}
82         }
83         
84             step=getNextPackageStep();
85             step.setUserFeedBack("related create : "+rt.getId()+" version "+nv+"..");
86                 rt.createPackage(nv);
87         ProviderManager.discoverPackages();
88                 target.setIncludedVersion(rt.getId(),""+nv);
89                 ProviderManager.resetSleepCounter();
90             step.setUserFeedBack("related create : "+rt.getId()+" version "+nv+"...done");
91             increaseSubProgressBar(1);
92     }
93     // set to 25%
94
increaseProgressBar(200);
95
96     relatedtargetcreate = new ArrayList JavaDoc();
97     
98
99     String JavaDoc newfilename=getBuildPath()+getName(target).replace(' ','_')+"@"+getMaintainer(target)+"_bundle_basic_"+newversion;
100
101     try {
102         JarOutputStream JavaDoc jarfile = new JarOutputStream JavaDoc(new FileOutputStream JavaDoc(newfilename+".tmb"),new Manifest JavaDoc());
103
104             step=getNextPackageStep();
105             step.setUserFeedBack("creating bundle.xml file...");
106         createBundleMetaFile(jarfile,target,newversion);
107             step.setUserFeedBack("creating bundle.xml file...done");
108
109         // add screenshots
110
addScreenshotFiles(jarfile,target);
111
112         // set to 35%
113
increaseProgressBar(100);
114
115         // loop the included packages to put them in the bundle jar
116
ArrayList JavaDoc packages=(ArrayList JavaDoc)target.getItem("includedpackages");
117
118             setSubProgressBar(packages.size());
119             for (Iterator JavaDoc i = packages.iterator(); i.hasNext();) {
120                     IncludedPackage ip=(IncludedPackage)i.next();
121             if (ip.getIncluded()) {
122                 // sometimes it seems to take a while before
123
// the bundle to show up so wait a while for it
124
PackageInterface p=PackageManager.getPackage(ip.getId(),ip.getVersion());
125                 int d=0;
126                 while (p == null && d<10) {
127                     try {
128                         Thread.sleep(1000);
129                     } catch(Exception JavaDoc e) {}
130                     p=PackageManager.getPackage(ip.getId(),ip.getVersion());
131                     d = d +1;
132                 }
133                 JarFile JavaDoc jf=p.getJarFile();
134                 if (jf!=null) {
135                     String JavaDoc includename=ip.getId()+"_"+ip.getVersion()+".mmp";
136                     String JavaDoc buildname=jf.getName();
137                             addFile(jarfile,buildname,includename,"packagefile","");
138                 }
139             }
140                         
141         }
142             increaseSubProgressBar(1);
143         // set to 55%
144
increaseProgressBar(200);
145
146         jarfile.close();
147     } catch(Exception JavaDoc e) {
148         e.printStackTrace();
149     }
150
151
152     // update the build file to reflect the last build, should only be done if no errors
153
if (getErrorCount()==0) {
154             File JavaDoc f1 = new File JavaDoc(newfilename+".tmb");
155             File JavaDoc f2 = new File JavaDoc(newfilename+".mmb");
156                 if (f2.exists()) {
157                    f2.delete();
158                 }
159             f2 = new File JavaDoc(newfilename+".mmb");
160             if (f1.renameTo(f2)) {
161             updatePackageTime(target,new Date JavaDoc(),newversion);
162             target.save();
163                 } else {
164                     log.error("rename failed from : "+newfilename+".tmp to : "+newfilename + ".mmb");
165                     return false;
166                 }
167             step=getNextPackageStep();
168             step.setUserFeedBack("Saving new version : "+newversion);
169     }
170     // set to 75%
171
increaseProgressBar(200);
172
173     // do we need to send this to a publish provider ?
174
if (target.getPublishState()) {
175         ProviderManager.discoverPackages();
176             step=getNextPackageStep();
177             step.setUserFeedBack("publishing to provider : "+target.getPublishProvider());
178             step=getNextPackageStep();
179             step.setUserFeedBack("sending file (version "+newversion+") : "+target.getId()+" ...");
180         if (target.publish(newversion,step)) {
181                 step.setUserFeedBack("sending file (version "+newversion+") : "+target.getId()+" ... done");
182         } else {
183                 step.setUserFeedBack("sending file (version "+newversion+") : "+target.getId()+" ... failed");
184         }
185     }
186     // set to 95%
187
increaseProgressBar(200);
188
189         step=getNextPackageStep();
190         step.setUserFeedBack("bundle/basic packager ended : "+getErrorCount()+" errors and "+getWarningCount()+" warnings");
191     // set to 100%
192
increaseProgressBar(50);
193         return true;
194    }
195
196
197    public void createBundleMetaFile(JarOutputStream JavaDoc jarfile,Target target,int newversion) {
198     Date JavaDoc d=new Date JavaDoc();
199     String JavaDoc body="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
200     body+="<!DOCTYPE bundle PUBLIC \"-//MMBase/DTD bundle config 1.0//EN\" \"http://www.mmbase.org/dtd/bundle_1_0.dtd\">\n";
201     body+="<bundle name=\""+getName(target)+"\" type=\""+getType()+"\" maintainer=\""+getMaintainer(target)+"\" version=\""+newversion+"\" creation-date=\""+d.toString()+"\" >\n";
202     body+="\t<description>"+getDescription(target)+"</description>\n";
203     body+="\t<license type=\""+getLicenseType(target)+"\" version=\""+getLicenseVersion(target)+"\" name=\""+getLicenseName(target)+"\" />\n";
204     body+="\t<releasenotes>\n"+getReleaseNotes(target)+"\n</releasenotes>\n";
205     body+="\t<installationnotes>\n"+getInstallationNotes(target)+"\n</installationnotes>\n";
206         body+="\t<installreset>"+getInstallReset(target)+"</installreset>\n";
207     body+=getScreenshotsXML(target);
208     body+=getStarturlsXML(target);
209     body+=getRelatedPeopleXML("initiators","initiator",target);
210     body+=getRelatedPeopleXML("supporters","supporter",target);
211     body+=getRelatedPeopleXML("developers","developer",target);
212     body+=getRelatedPeopleXML("contacts","contact",target);
213
214     body+=getNeededPackagesXML(target);
215
216     body+="</bundle>\n";
217     try {
218             JarEntry JavaDoc entry = new JarEntry JavaDoc("bundle.xml");
219             jarfile.putNextEntry(entry);
220             jarfile.write(body.getBytes("UTF-8"));
221     } catch (Exception JavaDoc e) {
222         e.printStackTrace();
223     }
224    }
225
226
227    public String JavaDoc getNeededPackagesXML(Target target) {
228     ArrayList JavaDoc packages=(ArrayList JavaDoc)target.getItem("includedpackages");
229     String JavaDoc body="\t<neededpackages>\n";
230     if (packages!=null) {
231             for (Iterator JavaDoc i = packages.iterator(); i.hasNext();) {
232                     IncludedPackage ip=(IncludedPackage)i.next();
233             body+="\t\t<package name=\""+ip.getName()+"\" type=\""+ip.getType()+"\" maintainer=\""+ip.getMaintainer()+"\" version=\""+ip.getVersion()+"\" included=\""+ip.getIncluded()+"\" />\n";
234         }
235     }
236     body+="\t</neededpackages>\n";
237     return body;
238      }
239
240   public ArrayList JavaDoc getIncludedPackages(Target target) {
241     Object JavaDoc o=target.getItem("includedpackages");
242     if (o!=null) {
243         return (ArrayList JavaDoc)o;
244     }
245     return null;
246   }
247
248   public boolean decodeItems(Target target) {
249             super.decodeItems(target);
250             // decode the needed packages
251
ArrayList JavaDoc includedpackages=new ArrayList JavaDoc();
252             ExtendedDocumentReader reader=target.getReader();
253                         org.w3c.dom.Node JavaDoc n=reader.getElementByPath(prefix+".neededpackages");
254                 org.w3c.dom.Node JavaDoc n2=n.getFirstChild();
255                 while (n2!=null) {
256                 if (n2.getNodeName().equals("package")) {
257                         NamedNodeMap JavaDoc nm=n2.getAttributes();
258                 String JavaDoc name=null;
259                 String JavaDoc type=null;
260                 String JavaDoc maintainer=null;
261                 String JavaDoc version=null;
262                 String JavaDoc included=null;
263                         if (nm!=null) {
264                                 org.w3c.dom.Node JavaDoc n3=nm.getNamedItem("name");
265                                 name=n3.getNodeValue();
266                                 n3=nm.getNamedItem("type");
267                                 type=n3.getNodeValue();
268                                 n3=nm.getNamedItem("maintainer");
269                                 maintainer=n3.getNodeValue();
270                                 n3=nm.getNamedItem("version");
271                                 version=n3.getNodeValue();
272                                 n3=nm.getNamedItem("included");
273                                 included=n3.getNodeValue();
274                     IncludedPackage ip=new IncludedPackage();
275                     ip.setName(name);
276                     ip.setMaintainer(maintainer);
277                     ip.setVersion(version);
278                     ip.setType(type);
279                     if (included.equals("true")) {
280                         ip.setIncluded(true);
281                     } else {
282                         ip.setIncluded(false);
283                     }
284                     includedpackages.add(ip);
285                 }
286             }
287                 n2=n2.getNextSibling();
288         }
289         target.setItem("includedpackages",includedpackages);
290         return false;
291   }
292
293   public boolean setIncludedVersion(Target target,String JavaDoc id,String JavaDoc newversion) {
294     ArrayList JavaDoc packages=(ArrayList JavaDoc)target.getItem("includedpackages");
295         for (Iterator JavaDoc i = packages.iterator(); i.hasNext();) {
296                 IncludedPackage ip=(IncludedPackage)i.next();
297         if (ip.getId().equals(id)) {
298             ip.setVersion(newversion);
299         }
300     }
301     target.save();
302         return true;
303   }
304
305
306   public boolean delIncludedPackage(Target target,String JavaDoc id) {
307     ArrayList JavaDoc packages=(ArrayList JavaDoc)target.getItem("includedpackages");
308         for (Iterator JavaDoc i = packages.iterator(); i.hasNext();) {
309                 IncludedPackage ip=(IncludedPackage)i.next();
310         if (ip.getId().equals(id)) {
311             packages.remove(ip);
312             break;
313         }
314     }
315     target.save();
316         return true;
317   }
318
319    public String JavaDoc getXMLFile(Target target) {
320         String JavaDoc body=getDefaultXMLHeader(target);
321     body+=getDefaultXMLMetaInfo(target);
322         body+=getScreenshotsXML(target);
323         body+=getStarturlsXML(target);
324         body+=getRelatedPeopleXML("initiators","initiator",target);
325         body+=getRelatedPeopleXML("supporters","supporter",target);
326         body+=getRelatedPeopleXML("developers","developer",target);
327         body+=getRelatedPeopleXML("contacts","contact",target);
328     body+=getNeededPackagesXML(target);
329     if (target.getPublishProvider()!=null) {
330         if (target.getPublishState()) {
331             body+="\t<publishprovider name=\""+target.getPublishProvider()+"\" state=\"active\" sharepassword=\""+target.getPublishSharePassword()+"\" />\n";
332         } else {
333             body+="\t<publishprovider name=\""+target.getPublishProvider()+"\" state=\"inactive\" sharepassword=\""+target.getPublishSharePassword()+"\" />\n";
334         }
335     }
336     body+=getDefaultXMLFooter(target);
337         return body;
338    }
339
340   public boolean addPackage(Target target,String JavaDoc newpackage) {
341     ArrayList JavaDoc packages=(ArrayList JavaDoc)target.getItem("includedpackages");
342     PackageInterface p=PackageManager.getPackage(newpackage);
343     if (p!=null) {
344              IncludedPackage ip=new IncludedPackage();
345              ip.setName(p.getName());
346              ip.setMaintainer(p.getMaintainer());
347              ip.setVersion(p.getVersion());
348              ip.setType(p.getType());
349              ip.setIncluded(true);
350          if (packages==null) {
351         packages=new ArrayList JavaDoc();
352         target.setItem("includedpackages",packages);
353          }
354          packages.add(ip);
355          target.save();
356              return true;
357     }
358         return false;
359   }
360
361
362 }
363
Popular Tags