/*******************************************************************************
* 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.fatjar.wizards.export;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import net.sf.fjep.anttask.FJAutoJarType;
import net.sf.fjep.anttask.FJBuildTask;
import net.sf.fjep.anttask.FJClassType;
import net.sf.fjep.anttask.FJExcludeType;
import net.sf.fjep.anttask.FJFileSourceType;
import net.sf.fjep.anttask.FJJarSourceType;
import net.sf.fjep.anttask.FJManifestType;
import net.sf.fjep.fatjar.popup.actions.FJTree;
import net.sf.fjep.fatjar.preferences.FatJarPreferencePage;
import net.sf.fjep.fatjar.wizards.export.FilesSelectPage.SourceInfo;
import net.sf.fjep.utils.FileUtils;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.widgets.Shell;
import org.osgi.framework.Bundle;
import thahn.java.agui.ide.eclipse.wizard.AguiPlugin;
public class BuildFJ {
private final static int PROGRESS_CLEAN = 50;
private final static int PROGRESS_COLLECT = 1000;
private final static int PROGRESS_PACK = 300;
public static void buildConfiguredFatJar(JProjectConfiguration jproject, BuildProperties props, SourceInfo[] sourceInfo) {
// Create a progress bar
Shell shell = new Shell();
ProgressMonitorDialog progressmonitordialog = new ProgressMonitorDialog(shell);
progressmonitordialog.open();
IProgressMonitor iprogressmonitor = progressmonitordialog.getProgressMonitor();
iprogressmonitor.beginTask("Build Fat jar", PROGRESS_CLEAN + PROGRESS_COLLECT + PROGRESS_PACK + PROGRESS_CLEAN);
// Make One-JAR?
boolean onejar = props.isUseOneJar();
String expand = props.getOnejarExpand();
String jarfile = null;
try {
props.save();
jarfile = buildFatJar(jproject, props, sourceInfo);
try {
jproject.getProject().refreshLocal(IResource.DEPTH_ONE, null);
} catch (CoreException e) { e.printStackTrace(); }
JProjectConfiguration.removeTempFatjarConfigs();
}
catch (Exception e) {
e.printStackTrace();
MessageDialog.openInformation(shell, "Fat Jar Plug-In ERROR", e.getMessage());
}
progressmonitordialog.close();
MessageDialog.openInformation(shell, "Fat Jar Plug-In", "built " + jarfile);
}
/**
* build using ANT Tasks from props and sourceInfo
* @param props
* @param sourceInfos
* @return
*/
public static String buildFatJar(JProjectConfiguration jproject, BuildProperties props, SourceInfo[] sourceInfos) {
FJBuildTask fjBuildTask = new FJBuildTask();
String fatjarPath = "?";
String output = props.getJarname().replace('\\', '/');
if (!props.isJarnameIsExtern()) {
output = jproject.getAbsProjectDir().replace('\\', '/') + "/" + output;
}
String outputName = output.substring(output.lastIndexOf('/')+1);
AguiPlugin pi = AguiPlugin.getDefault();
Bundle bundle = pi.getBundle();
if (bundle != null) {
String location = bundle.getLocation();
if (location != null)
fatjarPath = location.replaceFirst("update[@][/]?", "") + "fatjar.jar";
}
boolean oneJar = props.isUseOneJar();
fjBuildTask.setOnejar(oneJar);
fjBuildTask.setOutput(output);
IPreferenceStore store = AguiPlugin.getDefault().getPreferenceStore();
boolean escapeUCase = store.getBoolean(FatJarPreferencePage.P_ESCAPEUPPERCASE);
fjBuildTask.setEscapeUCase(escapeUCase);
// create manifest data
String manifestFile = props.getManifest_file();
String manifestClasspath = props.getManifest_classpath();
String manifestMainclass = props.getManifest_mainclass();
String manifestArguments = props.getManifest_arguments();
String manifestVMArguments = props.getManifest_vmarguments();
boolean manifestMergeall = props.isManifest_mergeall();
boolean manifestRemovesigners = props.isManifest_removesigners();
boolean autojarEnable = props.isAutojarEnable();
String autojarVisitClasses = props.getAutojarVisitClasses();
boolean autojarClassForName = props.isAutojarClassForName();
FJManifestType fjManifest = new FJManifestType();
fjManifest.setMergemanifests(manifestMergeall);
fjManifest.setRemovesigners(manifestRemovesigners);
if ((manifestFile != null) && (!manifestFile.trim().equals("")) && (!manifestFile.trim().equals("<createnew>"))) {
fjManifest.setManifestfile(manifestFile);
}
fjManifest.setMainclass(manifestMainclass);
if ((manifestClasspath != null) && (!manifestClasspath.trim().equals(""))) {
fjManifest.setClassPath(manifestClasspath);
}
if ((manifestArguments != null) && (!manifestArguments.trim().equals(""))) {
fjManifest.setArguments(manifestArguments);
}
if ((manifestVMArguments != null) && (!manifestVMArguments.trim().equals(""))) {
fjManifest.setVmarguments(manifestVMArguments);
}
fjBuildTask.addConfigured(fjManifest);
for (int i = 0; i < sourceInfos.length; i++) {
SourceInfo info = sourceInfos[i];
if (info.isJar) {
FJJarSourceType fjJarSource = new FJJarSourceType();
fjJarSource.setFile(info.absPath);
fjJarSource.setRelPath(info.relPath);
fjBuildTask.addConfigured(fjJarSource);
}
else {
FJFileSourceType fjFileSource = new FJFileSourceType();
fjFileSource.setPath(info.absPath);
fjFileSource.setRelPath(info.relPath);
if (info.excludes.size() != 0) {
for (int j = 0; j < info.excludes.size(); j++) {
String exclude = (String) info.excludes.get(j);
FJExcludeType fjExclude = new FJExcludeType();
fjExclude.setRelPath(exclude);
fjFileSource.addConfigured(fjExclude);
}
}
fjBuildTask.addConfigured(fjFileSource);
}
}
if (autojarEnable) {
FJAutoJarType fjAutoJar = new FJAutoJarType();
String[] classes = autojarVisitClasses.split("\\s+");
for (int i = 0; i < classes.length; i++) {
String className = classes[i];
FJClassType fjClass = new FJClassType();
fjClass.setClassname(className);
fjAutoJar.addConfigured(fjClass);
}
fjAutoJar.setSearchclassforname(autojarClassForName);
fjBuildTask.addConfigured(fjAutoJar);
}
fjBuildTask.execute();
return output;
}
/**
* 50 progress
*/
private static String doCleanFatJar(JProjectConfiguration jproject, IProgressMonitor iprogressMonitor) {
String tempdir = jproject.getTempBuildDir();
iprogressMonitor.subTask("Clean Fat Jar - remove " + tempdir);
FileUtils.recursiveRm(new File(tempdir));
iprogressMonitor.worked(50);
return tempdir;
}
public static FJTree buildTree(JProjectConfiguration jprojectsIn) {
List lst = jprojectsIn.getJProjectCollection();
FJTree rootNode = new FJTree(null, FJTree.NT_ROOT, "Fat Jar Tree for ",
null, FJTree.CS_CHECKED);
if (lst == null) {
build(rootNode,jprojectsIn);
return rootNode;
}
for (Iterator iter = lst.iterator(); iter.hasNext();) {
IJavaProject jproject = (IJavaProject) iter.next();
JProjectConfiguration jprojectConf = new JProjectConfiguration(
jproject, null);
build(rootNode, jprojectConf);
}
return rootNode;
}
private static void build(FJTree rootNode, JProjectConfiguration jprojectConf) {
String projectName = jprojectConf.getName();
// rootNode = new FJTree(null, FJTree.NT_ROOT,
// "Fat Jar Tree for " + projectName, jprojectConf,
// FJTree.CS_CHECKED);
Vector projects = new Vector();
Vector jarFiles = new Vector();
Vector classesDirs = new Vector();
jprojectConf.addClassPathEntries(jarFiles, classesDirs, projects,
false);
for (int i = 0; i < projects.size(); i++) {
JProjectConfiguration jpro = (JProjectConfiguration) projects
.get(i);
rootNode.addChild(FJTree.NT_PROJECT_OUTPUT, "Project '"
+ jpro.getProjectName() + "' output", new File(jpro
.getProjectOutputDir()), FJTree.CS_CHECKED);
}
for (int j = 0; j < classesDirs.size(); j++) {
String classesDir = (String) classesDirs.get(j);
rootNode.addChild(FJTree.NT_CLASSES, "Classes '" + classesDir
+ "'", new File(classesDir), FJTree.CS_CHECKED);
}
/*
* jproject.getClassPathJars(jarFiles, classesDirs, false); //
* jproject.getClassesDir(classesDirs); // String classesDir =
* (String) classesDirs.lastElement(); //
* rootNode.addChild(FJTree.NT_PROJECT_OUTPUT, "Project '" +
* jproject.getProjectName() + "' output", new File(classesDir),
* FJTree.CS_CHECKED); // for (int i=0; i<classesDirs.size()-1;
* i++) { // classesDir = (String) classesDirs.get(i); //
* rootNode.addChild(FJTree.NT_CLASSES, "Classes '" + classesDir +
* "'", new File(classesDir), FJTree.CS_CHECKED); // }
*
* jproject.getChildProjects(childProjects, false); for (int i=0; i<childProjects.size();
* i++) { JProjectConfiguration jChildProject =
* (JProjectConfiguration) childProjects.get(i); String
* childProjectName = jChildProject.getProjectName();
* classesDirs.clear(); jChildProject .getClassPathJars(jarFiles,
* classesDirs, true); jChildProject.getClassesDir(classesDirs);
* String classesDir = (String) classesDirs.lastElement();
* rootNode.addChild(FJTree.NT_PROJECT_OUTPUT, "Project '" +
* childProjectName + "' output", new File(classesDir),
* FJTree.CS_CHECKED); for (int j=0; j<classesDirs.size()-1; j++) {
* classesDir = (String) classesDirs.get(j);
* rootNode.addChild(FJTree.NT_CLASSES, "Classes '" + classesDir +
* "'", new File(classesDir), FJTree.CS_CHECKED); } }
*/
for (int i = 0; i < jarFiles.size(); i++) {
String jarFile = (String) jarFiles.get(i);
String jarname = File.separatorChar + jarFile;
jarname = jarname.substring(jarname
.lastIndexOf(File.separatorChar) + 1);
rootNode.addChild(FJTree.NT_JAR, jarname, new File(jarFile),
FJTree.CS_CHECKED);
}
}
}