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