001: /*
002: * The Apache Software License, Version 1.1
003: *
004: * Copyright (c) 1999 The Apache Software Foundation. All rights
005: * reserved.
006: *
007: * Redistribution and use in source and binary forms, with or without
008: * modification, are permitted provided that the following conditions
009: * are met:
010: *
011: * 1. Redistributions of source code must retain the above copyright
012: * notice, this list of conditions and the following disclaimer.
013: *
014: * 2. Redistributions in binary form must reproduce the above copyright
015: * notice, this list of conditions and the following disclaimer in
016: * the documentation and/or other materials provided with the
017: * distribution.
018: *
019: * 3. The end-user documentation included with the redistribution, if
020: * any, must include the following acknowlegement:
021: * "This product includes software developed by the
022: * Apache Software Foundation (http://www.apache.org/)."
023: * Alternately, this acknowlegement may appear in the software itself,
024: * if and wherever such third-party acknowlegements normally appear.
025: *
026: * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
027: * Foundation" must not be used to endorse or promote products derived
028: * from this software without prior written permission. For written
029: * permission, please contact apache@apache.org.
030: *
031: * 5. Products derived from this software may not be called "Apache"
032: * nor may "Apache" appear in their names without prior written
033: * permission of the Apache Group.
034: *
035: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
036: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
037: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
038: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
039: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
040: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
041: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
042: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
043: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
044: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
045: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
046: * SUCH DAMAGE.
047: * ====================================================================
048: *
049: * This software consists of voluntary contributions made by many
050: * individuals on behalf of the Apache Software Foundation. For more
051: * information on the Apache Software Foundation, please see
052: * <http://www.apache.org/>.
053: */
054:
055: package net.xoetrope.builder.editor.ant.taskdefs;
056:
057: import java.io.File;
058: import java.io.FileInputStream;
059: import java.io.FileOutputStream;
060: import java.io.IOException;
061: import java.io.InputStream;
062: import java.util.zip.ZipEntry;
063: import java.util.zip.ZipOutputStream;
064:
065: import net.xoetrope.builder.editor.ant.BuildException;
066: import net.xoetrope.builder.editor.ant.DirectoryScanner;
067:
068: /**
069: * Create a ZIP archive.
070: *
071: * @author James Davidson <a href="mailto:duncan@x180.com">duncan@x180.com</a>
072: * @author Jon S. Stevens <a href="mailto:jon@clearink.com">jon@clearink.com</a>
073: */
074:
075: public class Zip extends MatchingTask {
076:
077: private File zipFile;
078: private File baseDir;
079: protected String archiveType = "zip";
080:
081: /**
082: * This is the name/location of where to
083: * create the .zip file.
084: */
085: public void setZipfile(String zipFilename) {
086: zipFile = new File(zipFilename); //project.resolveFile(zipFilename);
087: }
088:
089: /**
090: * This is the base directory to look in for
091: * things to zip.
092: */
093: public void setBasedir(String baseDirname) {
094: baseDir = new File(baseDirname); //project.resolveFile(baseDirname);
095: }
096:
097: public void execute() throws BuildException {
098: if (baseDir == null) {
099: throw new BuildException("basedir attribute must be set!");
100: }
101: if (!baseDir.exists()) {
102: throw new BuildException("basedir does not exist!");
103: }
104:
105: DirectoryScanner ds = super .getDirectoryScanner(baseDir);
106:
107: String[] files = ds.getIncludedFiles();
108: String[] dirs = ds.getIncludedDirectories();
109:
110: // quick exit if the target is up to date
111: boolean upToDate = false;
112: for (int i = 0; i < files.length && upToDate; i++)
113: if (new File(baseDir, files[i]).lastModified() > zipFile
114: .lastModified())
115: upToDate = false;
116: if (upToDate)
117: return;
118:
119: try {
120: ZipOutputStream zOut = new ZipOutputStream(
121: new FileOutputStream(zipFile));
122: initZipOutputStream(zOut);
123:
124: for (int i = 0; i < dirs.length; i++) {
125: File f = new File(baseDir, dirs[i]);
126: String name = dirs[i].replace(File.separatorChar, '/')
127: + "/";
128: zipDir(f, zOut, name);
129: }
130:
131: for (int i = 0; i < files.length; i++) {
132: File f = new File(baseDir, files[i]);
133: String name = files[i].replace(File.separatorChar, '/');
134: zipFile(f, zOut, name);
135: }
136:
137: // close up
138: zOut.close();
139: } catch (IOException ioe) {
140: String msg = "Problem creating " + archiveType + " "
141: + ioe.getMessage();
142: throw new BuildException(msg);
143: }
144: }
145:
146: public void initZipOutputStream(ZipOutputStream zOut)
147: throws IOException, BuildException {
148: zOut.setMethod(ZipOutputStream.DEFLATED);
149: }
150:
151: protected void zipDir(File dir, ZipOutputStream zOut, String vPath)
152: throws IOException {
153: }
154:
155: protected void zipFile(InputStream in, ZipOutputStream zOut,
156: String vPath) throws IOException {
157: ZipEntry ze = new ZipEntry(vPath);
158: zOut.putNextEntry(ze);
159:
160: byte[] buffer = new byte[8 * 1024];
161: int count = 0;
162: do {
163: zOut.write(buffer, 0, count);
164: count = in.read(buffer, 0, buffer.length);
165: } while (count != -1);
166: }
167:
168: protected void zipFile(File file, ZipOutputStream zOut, String vPath)
169: throws IOException {
170: FileInputStream fIn = new FileInputStream(file);
171: zipFile(fIn, zOut, vPath);
172: fIn.close();
173: }
174: }
|