/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed 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 util.build;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
/**
* JarBuildStep takes a single input file and embeds it into a (new) jar file as a single entry.
*/
public class JarBuildStep extends BuildStep {
String outputJarEntryName;
private final boolean deleteInputFileAfterBuild;
public JarBuildStep(BuildFile inputFile, String outputJarEntryName,
BuildFile outputJarFile, boolean deleteInputFileAfterBuild) {
super(inputFile, outputJarFile);
this.outputJarEntryName = outputJarEntryName;
this.deleteInputFileAfterBuild = deleteInputFileAfterBuild;
}
@Override
boolean build() {
if (super.build()) {
File tempFile = new File(inputFile.folder, outputJarEntryName);
try {
if (!inputFile.fileName.equals(tempFile)) {
copyFile(inputFile.fileName, tempFile);
} else {
tempFile = null;
}
} catch (IOException e) {
System.err.println("io exception:"+e.getMessage());
e.printStackTrace();
return false;
}
File outDir = outputFile.fileName.getParentFile();
if (!outDir.exists() && !outDir.mkdirs()) {
System.err.println("failed to create output dir: "
+ outDir.getAbsolutePath());
return false;
}
// Find the input. We'll need to look into the input folder, but check with the
// (relative) destination filename (this is effectively removing the inputFile folder
// from the entry path in the jar file).
Path absoluteInputPath = Paths.get(inputFile.folder.getAbsolutePath())
.resolve(outputJarEntryName);
File absoluteInputFile = absoluteInputPath.toFile();
if (!absoluteInputFile.exists()) {
// Something went wrong.
throw new IllegalArgumentException(absoluteInputFile.getAbsolutePath());
}
// Use a JarOutputStream to create the output jar file.
File jarOutFile = outputFile.fileName;
try (JarOutputStream jarOut = new JarOutputStream(new FileOutputStream(jarOutFile))) {
// Create the JAR entry for the file. Use destFileName, and copy the timestamp
// from the input.
JarEntry entry = new JarEntry(outputJarEntryName);
entry.setTime(absoluteInputFile.lastModified());
// Push the entry. The stream will then be ready to accept content.
jarOut.putNextEntry(entry);
// Copy absoluteInputFile into the jar file.
Files.copy(absoluteInputPath, jarOut);
// Finish the entry.
jarOut.closeEntry();
// (Implicitly close the stream, finishing the jar file.)
} catch (Exception e) {
System.err.println("exception in JarBuildStep for " +
outputFile.fileName.getAbsolutePath() + ", " + outputJarEntryName);
e.printStackTrace(System.err);
jarOutFile.delete();
return false;
}
// Clean up.
if (tempFile != null) {
tempFile.delete();
}
if (deleteInputFileAfterBuild) {
inputFile.fileName.delete();
}
return true;
}
return false;
}
@Override
public int hashCode() {
return inputFile.hashCode() ^ outputFile.hashCode()
^ outputJarEntryName.hashCode();
}
@Override
public boolean equals(Object obj) {
if (super.equals(obj)) {
JarBuildStep other = (JarBuildStep) obj;
return inputFile.equals(other.inputFile)
&& outputFile.equals(other.outputFile)
&& outputJarEntryName.equals(other.outputJarEntryName);
}
return false;
}
}