KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > de > masters_of_disaster > ant > tasks > deb > Deb


1 package de.masters_of_disaster.ant.tasks.deb;
2
3 import de.masters_of_disaster.ant.tasks.ar.Ar;
4 import de.masters_of_disaster.ant.tasks.ar.Ar.ArFileSet;
5 import java.io.File JavaDoc;
6 import java.util.Enumeration JavaDoc;
7 import java.util.Vector JavaDoc;
8 import org.apache.tools.ant.BuildException;
9 import org.apache.tools.ant.Project;
10 import org.apache.tools.ant.Task;
11 import org.apache.tools.ant.taskdefs.Checksum;
12 import org.apache.tools.ant.taskdefs.Echo;
13 import org.apache.tools.ant.taskdefs.Echo.EchoLevel;
14 import org.apache.tools.ant.taskdefs.Mkdir;
15 import org.apache.tools.ant.taskdefs.MatchingTask;
16 import org.apache.tools.ant.taskdefs.Tar;
17 import org.apache.tools.ant.taskdefs.Tar.TarCompressionMethod;
18 import org.apache.tools.ant.taskdefs.Tar.TarFileSet;
19 import org.apache.tools.ant.util.FileUtils;
20 import org.apache.tools.ant.util.MergingMapper;
21 import org.apache.tools.ant.util.SourceFileScanner;
22
23 /**
24  * Creates a deb package.
25  *
26  * @ant.task category="packaging"
27  */

28 public class Deb extends MatchingTask {
29     Vector JavaDoc controlFileSets = new Vector JavaDoc();
30     Vector JavaDoc dataFileSets = new Vector JavaDoc();
31     File JavaDoc baseDir;
32     File JavaDoc destFile;
33     File JavaDoc tempDir;
34     boolean deleteTempFiles = true;
35     boolean includeMd5sums = false;
36     Tar controlTarGz = new Tar();
37     Tar dataTarGz = new Tar();
38     Ar debPackage = new Ar();
39
40     {
41         fileset = dataTarGz.createTarFileSet();
42         TarFileSet tarFileSet = controlTarGz.createTarFileSet();
43         tarFileSet.setFile(new File JavaDoc(System.getProperty("user.dir")));
44         tarFileSet.setUserName("root");
45         tarFileSet.setGroup("root");
46         tarFileSet.setFullpath("./");
47         tarFileSet = dataTarGz.createTarFileSet();
48         tarFileSet.setFile(new File JavaDoc(System.getProperty("user.dir")));
49         tarFileSet.setUserName("root");
50         tarFileSet.setGroup("root");
51         tarFileSet.setFullpath("./");
52     }
53
54     /**
55      * Add a new fileset for the control files with the option to specify permissions
56      *
57      * @return the tar fileset to be used as the nested element.
58      */

59     public TarFileSet createControlFileSet() {
60         TarFileSet fileSet = controlTarGz.createTarFileSet();
61         controlFileSets.addElement(fileSet);
62         return fileSet;
63     }
64
65     /**
66      * Add a new fileset for the data files with the option to specify permissions
67      *
68      * @return the tar fileset to be used as the nested element.
69      */

70     public TarFileSet createDataFileSet() {
71         TarFileSet fileSet = dataTarGz.createTarFileSet();
72         dataFileSets.addElement(fileSet);
73         return fileSet;
74     }
75
76     /**
77      * Set the name/location of where to create the deb file.
78      *
79      * @param destFile The output of the deb
80      */

81     public void setDestFile(File JavaDoc destFile) {
82         this.destFile = destFile;
83         debPackage.setDestFile(destFile);
84     }
85
86     /**
87      * This is the base directory to look in for things to include in the data files.
88      *
89      * @param baseDir the base directory.
90      */

91     public void setBaseDir(File JavaDoc baseDir) {
92         this.baseDir = baseDir;
93         fileset.setDir(baseDir);
94     }
95
96     /**
97      * This is the temp directory where to create the temporary files.
98      * If not set, the current projects baseDir is used.
99      *
100      * @param tempDir the temp directory.
101      */

102     public void setTempDir(File JavaDoc tempDir) {
103         this.tempDir = tempDir;
104     }
105
106     /**
107      * This specifies if the temporary files should get deleted.
108      *
109      * @param deleteTempFiles whether to delete the temporary files or not.
110      */

111     public void setDeleteTempFiles(boolean deleteTempFiles) {
112         this.deleteTempFiles = deleteTempFiles;
113     }
114
115     /**
116      * This specifies if the MD5 sums of the files in the data section should be
117      * included in the file "md5sums" in the control section.
118      *
119      * @param includeMd5sums whether to include MD5 sums in the control section or not.
120      */

121     public void setIncludeMd5sums(boolean includeMd5sums) {
122         this.includeMd5sums = includeMd5sums;
123     }
124
125     /**
126      * do the business
127      *
128      * @throws BuildException on error
129      */

130     public void execute() throws BuildException {
131         if (null == tempDir) {
132             tempDir = getProject().getBaseDir();
133         }
134
135         if (null != baseDir) {
136             // add the main fileset to the list of filesets to process.
137
dataFileSets.addElement(fileset);
138         } else {
139             fileset.setDir(new File JavaDoc(System.getProperty("user.dir")));
140             fileset.setExcludes("**");
141         }
142
143         boolean controlFound = false;
144         for (Enumeration JavaDoc e=controlFileSets.elements() ; e.hasMoreElements() ; ) {
145             TarFileSet fileSet = (TarFileSet)e.nextElement();
146             String JavaDoc[] files = fileSet.getFiles(getProject());
147             int i = 0;
148             int c;
149
150             for (c=files.length ; i<c && !controlFound ; i++) {
151                 if (files[i].endsWith("control")
152                       && (new File JavaDoc(fileSet.getDir(getProject()),files[i])).isFile()) {
153                     controlFound = true;
154                 }
155             }
156         }
157         if (!controlFound) {
158             throw new BuildException("The control fileset must contain a file \"control\"", getLocation());
159         }
160
161         // check if deb is out of date with respect to each fileset
162
boolean upToDate = true;
163         for (Enumeration JavaDoc e=controlFileSets.elements() ; e.hasMoreElements() ; ) {
164             TarFileSet fileSet = (TarFileSet)e.nextElement();
165             String JavaDoc[] files = fileSet.getFiles(getProject());
166
167             if (!packageIsUpToDate(files,fileSet.getDir(getProject()))) {
168                 upToDate = false;
169             }
170         }
171
172         for (Enumeration JavaDoc e=dataFileSets.elements() ; e.hasMoreElements() ; ) {
173             TarFileSet fileSet = (TarFileSet)e.nextElement();
174             String JavaDoc[] files = fileSet.getFiles(getProject());
175
176             if (!packageIsUpToDate(files,fileSet.getDir(getProject()))) {
177                 upToDate = false;
178             }
179         }
180
181         if (upToDate) {
182             log("Nothing to do: " + destFile.getAbsolutePath()
183                 + " is up to date.", Project.MSG_INFO);
184             return;
185         }
186
187         log("Building deb: " + destFile.getAbsolutePath(), Project.MSG_INFO);
188
189         Mkdir mkdir = new Mkdir();
190         mkdir.setDir(tempDir);
191         prepareTask(mkdir);
192         mkdir.perform();
193
194         Echo echo = new Echo();
195         EchoLevel echoLevel = new EchoLevel();
196         echoLevel.setValue("error");
197         File JavaDoc debianBinaryFile = new File JavaDoc(tempDir,"debian-binary");
198         echo.setFile(debianBinaryFile);
199         echo.setLevel(echoLevel);
200         echo.setMessage("2.0\n");
201         prepareTask(echo);
202         echo.perform();
203
204         for (Enumeration JavaDoc e=controlFileSets.elements() ; e.hasMoreElements() ; ) {
205             TarFileSet fileSet = (TarFileSet)e.nextElement();
206             String JavaDoc prefix = fileSet.getPrefix();
207             if (!prefix.startsWith("./")) {
208                 if (prefix.startsWith("/")) {
209                     fileSet.setPrefix("." + prefix);
210                 } else {
211                     fileSet.setPrefix("./" + prefix);
212                 }
213             }
214             String JavaDoc fullpath = fileSet.getFullpath();
215             if ((fullpath.length() > 0) && !fullpath.startsWith("./")) {
216                 if (fullpath.startsWith("/")) {
217                     fileSet.setFullpath("." + fullpath);
218                 } else {
219                     fileSet.setFullpath("./" + fullpath);
220                 }
221             }
222             if ((0 == fileSet.getUid()) && ("" == fileSet.getUserName())) {
223                 fileSet.setUserName("root");
224             }
225             if ((0 == fileSet.getGid()) && ("" == fileSet.getGroup())) {
226                 fileSet.setGroup("root");
227             }
228         }
229
230         for (Enumeration JavaDoc e=dataFileSets.elements() ; e.hasMoreElements() ; ) {
231             TarFileSet fileSet = (TarFileSet)e.nextElement();
232             String JavaDoc prefix = fileSet.getPrefix();
233             if (!prefix.startsWith("./")) {
234                 if (prefix.startsWith("/")) {
235                     fileSet.setPrefix("." + prefix);
236                 } else {
237                     fileSet.setPrefix("./" + prefix);
238                 }
239             }
240             String JavaDoc fullpath = fileSet.getFullpath();
241             if ((fullpath.length() > 0) && !fullpath.startsWith("./")) {
242                 if (fullpath.startsWith("/")) {
243                     fileSet.setFullpath("." + fullpath);
244                 } else {
245                     fileSet.setFullpath("./" + fullpath);
246                 }
247             }
248             if ((0 == fileSet.getUid()) && ("" == fileSet.getUserName())) {
249                 fileSet.setUserName("root");
250             }
251             if ((0 == fileSet.getGid()) && ("" == fileSet.getGroup())) {
252                 fileSet.setGroup("root");
253             }
254         }
255
256         File JavaDoc md5sumsFile = new File JavaDoc(tempDir,"md5sums");
257         if (includeMd5sums) {
258             Checksum md5 = new Checksum();
259             prepareTask(md5);
260             int md5Count = 0;
261             StringBuffer JavaDoc md5sums = new StringBuffer JavaDoc();
262             for (Enumeration JavaDoc e=dataFileSets.elements() ; e.hasMoreElements() ; ) {
263                 TarFileSet fileSet = (TarFileSet)e.nextElement();
264                 String JavaDoc[] files = fileSet.getDirectoryScanner(getProject()).getIncludedFiles();
265                 File JavaDoc fileSetDir = fileSet.getDir(getProject());
266                 for (int i=0, c=files.length ; i<c ; i++) {
267                     md5.setFile(new File JavaDoc(fileSetDir,files[i]));
268                     md5.setProperty("md5_"+md5Count);
269                     md5.perform();
270                     md5sums.append(getProject().getProperty("md5_"+md5Count)).append(" ");
271                     String JavaDoc fullpath = fileSet.getFullpath();
272                     if (fullpath.length() > 0) {
273                         md5sums.append(fullpath.substring(2));
274                     } else {
275                         md5sums.append(fileSet.getPrefix().substring(2)).append(files[i].replace('\\','/'));
276                     }
277                     md5sums.append("\n");
278                     md5Count++;
279                 }
280             }
281             echo.setFile(md5sumsFile);
282             echo.setMessage(md5sums.toString());
283             echo.perform();
284             TarFileSet tarFileSet = controlTarGz.createTarFileSet();
285             tarFileSet.setFile(md5sumsFile);
286             tarFileSet.setUserName("root");
287             tarFileSet.setGroup("root");
288             tarFileSet.setPrefix("./");
289         }
290
291         TarCompressionMethod tarCompressionMethod = new TarCompressionMethod();
292         tarCompressionMethod.setValue("gzip");
293         controlTarGz.setCompression(tarCompressionMethod);
294         File JavaDoc controlTarGzFile = new File JavaDoc(tempDir,"control.tar.gz");
295         controlTarGz.setDestFile(controlTarGzFile);
296         prepareTask(controlTarGz);
297         controlTarGz.perform();
298
299         dataTarGz.setCompression(tarCompressionMethod);
300         File JavaDoc dataTarGzFile = new File JavaDoc(tempDir,"data.tar.gz");
301         dataTarGz.setDestFile(dataTarGzFile);
302         prepareTask(dataTarGz);
303         dataTarGz.perform();
304
305         FileUtils.delete(destFile);
306         ArFileSet fileSet = debPackage.createArFileSet();
307         fileSet.setFile(debianBinaryFile);
308         fileSet = debPackage.createArFileSet();
309         fileSet.setFile(controlTarGzFile);
310         fileSet = debPackage.createArFileSet();
311         fileSet.setFile(dataTarGzFile);
312         prepareTask(debPackage);
313         debPackage.perform();
314
315         if (deleteTempFiles) {
316             FileUtils.delete(debianBinaryFile);
317             FileUtils.delete(controlTarGzFile);
318             FileUtils.delete(dataTarGzFile);
319             FileUtils.delete(md5sumsFile);
320         }
321     }
322
323     /**
324      * Checks whether the package is up to date in relationship to a list of files.
325      *
326      * @param files the files to check
327      * @param dir the base directory for the files.
328      * @return true if the archive is up to date.
329      */

330     protected boolean packageIsUpToDate(String JavaDoc[] files, File JavaDoc dir) {
331         SourceFileScanner sfs = new SourceFileScanner(this);
332         MergingMapper mm = new MergingMapper();
333         mm.setTo(destFile.getAbsolutePath());
334         return sfs.restrict(files, dir, null, mm).length == 0;
335     }
336
337     /**
338      * Prepares a task for execution.
339      *
340      * @param task the task to prepare
341      */

342     protected void prepareTask(Task task) {
343         task.setProject(getProject());
344         task.setOwningTarget(getOwningTarget());
345         task.setTaskName(getTaskName());
346         task.setTaskType(getTaskType());
347     }
348 }
349
Popular Tags