• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright 2007 Google Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
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 
setVerbose(boolean verbose)43     public void setVerbose(boolean verbose) {
44         this.verbose = verbose;
45     }
46 
execute()47     public abstract void execute() throws BuildException;
48 
execute(JarProcessor proc)49     public void execute(JarProcessor proc) throws BuildException {
50         this.proc = proc;
51         super.execute();
52     }
53 
setFilesonly(boolean f)54     public void setFilesonly(boolean f) {
55         super.setFilesonly(f);
56         filesOnly = f;
57     }
58 
zipDir(File dir, ZipOutputStream zOut, String vPath, int mode)59     protected void zipDir(File dir, ZipOutputStream zOut, String vPath, int mode)
60         throws IOException {
61     }
62 
zipFile(InputStream is, ZipOutputStream zOut, String vPath, long lastModified, File fromArchive, int mode)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 
addParentDirs(String file, ZipOutputStream zOut)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 
reset()92     public void reset() {
93         super.reset();
94         cleanHelper();
95     }
96 
cleanUp()97     protected void cleanUp() {
98         super.cleanUp();
99         cleanHelper();
100     }
101 
cleanHelper()102     protected void cleanHelper() {
103         verbose = false;
104         filesOnly = false;
105         dirs.clear();
106     }
107 }
108