blob: 7735666c54dc042657c616357361cacc260e799b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.types.resources.FileResource;
/**
* Abstract Base class for pack tasks.
*
* @since Ant 1.5
*/
public abstract class Pack extends Task {
private static final int BUFFER_SIZE = 8 * 1024;
// CheckStyle:VisibilityModifier OFF - bc
protected File zipFile;
protected File source;
// CheckStyle:VisibilityModifier ON
private Resource src;
/**
* the required destination file.
* @param zipFile the destination file
*/
public void setZipfile(File zipFile) {
this.zipFile = zipFile;
}
/**
* the required destination file.
* @param zipFile the destination file
*/
public void setDestfile(File zipFile) {
setZipfile(zipFile);
}
/**
* the file to compress; required.
* @param src the source file
*/
public void setSrc(File src) {
setSrcResource(new FileResource(src));
}
/**
* The resource to pack; required.
* @param src resource to expand
*/
public void setSrcResource(Resource src) {
if (src.isDirectory()) {
throw new BuildException("the source can't be a directory");
}
if (src instanceof FileResource) {
source = ((FileResource) src).getFile();
} else if (!supportsNonFileResources()) {
throw new BuildException("Only FileSystem resources are"
+ " supported.");
}
this.src = src;
}
/**
* Set the source resource.
* @param a the resource to pack as a single element Resource collection.
*/
public void addConfigured(ResourceCollection a) {
if (a.size() == 0) {
throw new BuildException("No resource selected, " + getTaskName()
+ " needs exactly one resource.");
}
if (a.size() != 1) {
throw new BuildException(getTaskName()
+ " cannot handle multiple resources at once. (" + a.size()
+ " resources were selected.)");
}
setSrcResource((Resource) a.iterator().next());
}
/**
* validation routine
* @throws BuildException if anything is invalid
*/
private void validate() throws BuildException {
if (zipFile == null) {
throw new BuildException("zipfile attribute is required", getLocation());
}
if (zipFile.isDirectory()) {
throw new BuildException("zipfile attribute must not "
+ "represent a directory!", getLocation());
}
if (getSrcResource() == null) {
throw new BuildException("src attribute or nested resource is"
+ " required", getLocation());
}
}
/**
* validate, then hand off to the subclass
* @throws BuildException on error
*/
public void execute() throws BuildException {
validate();
Resource s = getSrcResource();
if (!s.isExists()) {
log("Nothing to do: " + s.toString()
+ " doesn't exist.");
} else if (zipFile.lastModified() < s.getLastModified()) {
log("Building: " + zipFile.getAbsolutePath());
pack();
} else {
log("Nothing to do: " + zipFile.getAbsolutePath()
+ " is up to date.");
}
}
/**
* zip a stream to an output stream
* @param in the stream to zip
* @param zOut the output stream
* @throws IOException
*/
private void zipFile(InputStream in, OutputStream zOut)
throws IOException {
byte[] buffer = new byte[BUFFER_SIZE];
int count = 0;
do {
zOut.write(buffer, 0, count);
count = in.read(buffer, 0, buffer.length);
} while (count != -1);
}
/**
* zip a file to an output stream
* @param file the file to zip
* @param zOut the output stream
* @throws IOException on error
*/
protected void zipFile(File file, OutputStream zOut)
throws IOException {
zipResource(new FileResource(file), zOut);
}
/**
* zip a resource to an output stream
* @param resource the resource to zip
* @param zOut the output stream
* @throws IOException on error
*/
protected void zipResource(Resource resource, OutputStream zOut)
throws IOException {
InputStream rIn = resource.getInputStream();
try {
zipFile(rIn, zOut);
} finally {
rIn.close();
}
}
/**
* subclasses must implement this method to do their compression
*/
protected abstract void pack();
/**
* The source resource.
* @return the source.
* @since Ant 1.7
*/
public Resource getSrcResource() {
return src;
}
/**
* Whether this task can deal with non-file resources.
*
* <p>This implementation returns false.</p>
* @return false.
* @since Ant 1.7
*/
protected boolean supportsNonFileResources() {
return false;
}
}