1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.tonicsystems.jarjar.util;
18
19 import java.io.*;
20 import java.util.*;
21 import org.apache.tools.ant.BuildException;
22 import org.apache.tools.ant.taskdefs.Jar;
23 import org.apache.tools.ant.types.ZipFileSet;
24 import org.apache.tools.zip.JarMarker;
25 import org.apache.tools.zip.ZipExtraField;
26 import org.apache.tools.zip.ZipOutputStream;
27
28 abstract public class AntJarProcessor extends Jar
29 {
30 private EntryStruct struct = new EntryStruct();
31 private JarProcessor proc;
32 private byte[] buf = new byte[0x2000];
33
34 private Set<String> dirs = new HashSet<String>();
35 private boolean filesOnly;
36
37 protected boolean verbose;
38
39 private static final ZipExtraField[] JAR_MARKER = new ZipExtraField[] {
40 JarMarker.getInstance()
41 };
42
43 public void setVerbose(boolean verbose) {
44 this.verbose = verbose;
45 }
46
47 public abstract void execute() throws BuildException;
48
49 public void execute(JarProcessor proc) throws BuildException {
50 this.proc = proc;
51 super.execute();
52 }
53
54 public void setFilesonly(boolean f) {
55 super.setFilesonly(f);
56 filesOnly = f;
57 }
58
59 protected void zipDir(File dir, ZipOutputStream zOut, String vPath, int mode)
60 throws IOException {
61 }
62
63 protected void zipFile(InputStream is, ZipOutputStream zOut, String vPath,
64 long lastModified, File fromArchive, int mode) throws IOException {
65 ByteArrayOutputStream baos = new ByteArrayOutputStream();
66 IoUtil.pipe(is, baos, buf);
67 struct.data = baos.toByteArray();
68 struct.name = vPath;
69 struct.time = lastModified;
70 if (proc.process(struct)) {
71 if (mode == 0)
72 mode = ZipFileSet.DEFAULT_FILE_MODE;
73 if (!filesOnly) {
74 addParentDirs(struct.name, zOut);
75 }
76 super.zipFile(new ByteArrayInputStream(struct.data),
77 zOut, struct.name, struct.time, fromArchive, mode);
78 }
79 }
80
81 private void addParentDirs(String file, ZipOutputStream zOut) throws IOException {
82 int slash = file.lastIndexOf('/');
83 if (slash >= 0) {
84 String dir = file.substring(0, slash);
85 if (dirs.add(dir)) {
86 addParentDirs(dir, zOut);
87 super.zipDir((File) null, zOut, dir + "/", ZipFileSet.DEFAULT_DIR_MODE, JAR_MARKER);
88 }
89 }
90 }
91
92 public void reset() {
93 super.reset();
94 cleanHelper();
95 }
96
97 protected void cleanUp() {
98 super.cleanUp();
99 cleanHelper();
100 }
101
102 protected void cleanHelper() {
103 verbose = false;
104 filesOnly = false;
105 dirs.clear();
106 }
107 }