/*******************************************************************************
* Copyright (c) 2004 Ferenc Hechler - ferenc_hechler@users.sourceforge.net
*
* This file is part of the Fat Jar Eclipse Plug-In
*
* The Fat Jar Eclipse Plug-In is free software;
* you can redistribute it and/or modify it under the terms of the GNU
* General Public License as published by the Free Software Foundation;
* either version 2 of the License, or (at your option) any later version.
*
* The Fat Jar Eclipse Plug-In is distributed
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with the Fat Jar Eclipse Plug-In;
* if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*******************************************************************************/
package net.sf.fjep.anttask;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import net.sf.fjep.fatjar.builder.ByteArrayFileSystemElement;
import net.sf.fjep.fatjar.builder.FatJarBuilder;
import net.sf.fjep.fatjar.builder.FileSystemSourceFilter;
import net.sf.fjep.fatjar.builder.IFileSystemSource;
import net.sf.fjep.fatjar.builder.JARFileSystemSource;
import net.sf.fjep.fatjar.builder.NativeFileSystemSource;
import net.sf.fjep.fatjar.builder.OneJarBuilder;
import net.sf.fjep.fatjar.builder.VirtualFileSystemSource;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
public class FJBuildTask extends Task {
private ArrayList sources;
private String output;
public String getOutput() { return output; }
public void setOutput(String output) { this.output = output; }
private boolean onejar = false;
public boolean getOnejar() { return onejar; }
public void setOnejar(boolean onejar) { this.onejar = onejar; }
private boolean escapeUCase = false;
public boolean getEscapeUCase() { return escapeUCase; }
public void setEscapeUCase(boolean escapeUCase) { this.escapeUCase = escapeUCase; }
private FJManifestType manifestType = null;
private FJAutoJarType autojarType = null;
public FJBuildTask() {
sources = new ArrayList();
}
// The method executing the task
public void execute() throws BuildException {
try {
if (onejar)
doBuildOneJar();
else
doBuildFatJar();
} catch (Exception e) {
e.printStackTrace();
throw new BuildException("build '" + output + "' error: " + e.getMessage());
}
}
private void doBuildFatJar() throws IOException {
System.out.println("Build Output='" + output + "'");
FatJarBuilder builder = new FatJarBuilder();
builder.setEscapeUCase(escapeUCase);
if (manifestType != null) {
System.out.println(manifestType.toString());
String manifestText = manifestType.getManifestText();
VirtualFileSystemSource vsource = new VirtualFileSystemSource();
vsource.add(new ByteArrayFileSystemElement("META-INF", "MANIFEST.MF", manifestText.getBytes()));
builder.addSource(vsource);
builder.addSource(manifestType.getHelperResources());
builder.addConflictResolver(manifestType.getConflictResolver());
builder.setRemoveSigners(manifestType.isRemovesigners());
}
for (Iterator iter = sources.iterator(); iter.hasNext();) {
Object o = iter.next();
if (o instanceof FJFileSourceType) {
FJFileSourceType fjFileSource = (FJFileSourceType) o;
System.out.println("adding native file system source '" + fjFileSource.getPath() + "'");
File folder = new File(fjFileSource.getPath());
String relPath = fjFileSource.getRelPath();
IFileSystemSource fileSystemSource = new NativeFileSystemSource(folder, relPath);
String[] excludes = fjFileSource.getExcludes();
String[] excludesRX = fjFileSource.getExcludesRX();
if (excludes.length + excludesRX.length > 0) {
System.out.println("excluding " + excludes.length + " entries and " + excludesRX.length + " patterns");
fileSystemSource = new FileSystemSourceFilter(fileSystemSource, excludes, excludesRX);
}
builder.addSource(fileSystemSource);
}
else if (o instanceof FJJarSourceType) {
FJJarSourceType fjJarSource = (FJJarSourceType) o;
System.out.println("adding jar file source '" + fjJarSource.getFile() + "'");
String jarFilename = fjJarSource.getFile();
String relPath = fjJarSource.getRelPath();
IFileSystemSource fileSystemSource = new JARFileSystemSource(jarFilename, relPath);
String[] excludes = fjJarSource.getExcludes();
String[] excludesRX = fjJarSource.getExcludesRX();
if (excludes.length + excludesRX.length > 0) {
System.out.println("excluding " + excludes.length + " entries and " + excludesRX.length + " patterns");
fileSystemSource = new FileSystemSourceFilter(fileSystemSource, excludes, excludesRX);
}
builder.addSource(fileSystemSource);
}
}
if ((autojarType != null) && (autojarType.visitClasses != null) && (autojarType.visitClasses.size() > 0)) {
int cntClasses = autojarType.visitClasses.size();
String[] vclasses = new String[cntClasses];
for (int i = 0; i < cntClasses; i++) {
FJClassType fjClass = (FJClassType)autojarType.visitClasses.get(i);
vclasses[i] = fjClass.getClassname().replace('.', '/');
}
builder.addVisitClasses(vclasses);
builder.setSearchClassForName(autojarType.isSearchclassforname());
}
builder.build(output);
}
private void doBuildOneJar() throws IOException {
System.out.println("Build One-Jar Output='" + output + "'");
OneJarBuilder builder = new OneJarBuilder(output.replace('.', '_') + "_temp_eraseme");
if (manifestType != null) {
System.out.println(manifestType.toString());
String manifestText = manifestType.getInnerOneJarManifestText();
VirtualFileSystemSource vsource = new VirtualFileSystemSource();
vsource.add(new ByteArrayFileSystemElement("META-INF", "MANIFEST.MF", manifestText.getBytes()));
builder.addSource(vsource);
builder.addConflictResolver(manifestType.getConflictResolver());
}
for (Iterator iter = sources.iterator(); iter.hasNext();) {
Object o = iter.next();
if (o instanceof FJFileSourceType) {
FJFileSourceType fjFileSource = (FJFileSourceType) o;
System.out.println("adding native file system source '" + fjFileSource.getPath() + "'");
File folder = new File(fjFileSource.getPath());
String relPath = fjFileSource.getRelPath();
IFileSystemSource fileSystemSource = new NativeFileSystemSource(folder, relPath);
String[] excludes = fjFileSource.getExcludes();
String[] excludesRX = fjFileSource.getExcludesRX();
if (excludes.length + excludesRX.length > 0) {
System.out.println("excluding " + excludes.length + " entries and " + excludesRX.length + " patterns");
fileSystemSource = new FileSystemSourceFilter(fileSystemSource, excludes, excludesRX);
}
builder.addSource(fileSystemSource);
}
else if (o instanceof FJJarSourceType) {
FJJarSourceType fjJarSource = (FJJarSourceType) o;
System.out.println("adding jar file source '" + fjJarSource.getFile() + "'");
String jarFilename = fjJarSource.getFile();
String relPath = fjJarSource.getRelPath();
// Bug-Fix reported by micrac [Bug 1268275]
// VirtualFileSystemSource vsource = new VirtualFileSystemSource();
// File f = new File(jarFilename);
// vsource.add(new NativeFileSystemElement(f.getParentFile(), "lib", f.getName()));
// builder.addSource(vsource);
IFileSystemSource fileSystemSource = new JARFileSystemSource(jarFilename, relPath);
String[] excludes = fjJarSource.getExcludes();
String[] excludesRX = fjJarSource.getExcludesRX();
if (excludes.length + excludesRX.length > 0) {
System.out.println("excluding " + excludes.length + " entries and " + excludesRX.length + " patterns");
fileSystemSource = new FileSystemSourceFilter(fileSystemSource, excludes, excludesRX);
}
builder.addSource(fileSystemSource);
}
}
builder.setOnejarManifestText(manifestType.getOuterOneJarManifestText());
builder.setOnejarHelperResource(manifestType.getHelperResources());
builder.build(output);
}
public void addConfigured(FJFileSourceType source) {
sources.add(source);
}
public void addConfigured(FJJarSourceType source) {
sources.add(source);
}
public void addConfigured(FJManifestType manifestType) {
this.manifestType = manifestType;
}
public void addConfigured(FJAutoJarType autojarType) {
this.autojarType = autojarType;
}
// public static void main(String[] args) {
//
// FJBuildTask fjBuild = new FJBuildTask();
// fjBuild.setOutput("U:\\test.jar");
// fjBuild.setOnejar(true);
//
// FJManifestType fjManifest = new FJManifestType();
// fjManifest.setMainclass("mainb.MainB");
// fjBuild.addConfigured(fjManifest);
//
// FJFileSourceType fjFileClasses = new FJFileSourceType();
// fjFileClasses.setPath("U:\\fatjar-tesprojects\\test-mainB\\classes");
// fjBuild.addConfigured(fjFileClasses);
//
// FJJarSourceType fjJarLibA = new FJJarSourceType();
// fjJarLibA.setFile("U:\\fatjar-tesprojects\\test-mainB\\lib\\test-libA_fat.jar");
// fjBuild.addConfigured(fjJarLibA);
//
// FJJarSourceType fjJarLibB = new FJJarSourceType();
// fjJarLibB.setFile("U:\\fatjar-tesprojects\\test-mainB\\lib\\test-libB_fat.jar");
// fjBuild.addConfigured(fjJarLibB);
//
// fjBuild.execute();
// }
}