/*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* GenerateSetup.java
* Copyright (C) 2006 University of Waikato, Hamilton, New Zealand
*
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;
import java.util.Vector;
/**
* Generates a setup file for <a href="http://nsis.sourceforget.net"
* target="_blank">NSIS</a>.
*
* @author FracPete (fracpete at waikato dot ac dot nz)
* @version $Revision: 1.5 $
*/
public class GenerateSetup {
/** the templates directory */
public final static String TEMPLATES = "templates";
/** the images directory */
public final static String IMAGES = "images";
/** the batch file for JRE */
public final static String JRE_BATCH = "RunJREInstaller.bat";
/** the version */
protected String mVersion = "";
/** the input directory */
protected String mInputDir = "";
/** the output directory */
protected String mOutputDir = "";
/** the directory for Weka (in "Program Files") */
protected String mDir = "";
/** the prefix for links */
protected String mLinkPrefix = "";
/** the jre file */
protected String mJRE = "";
/**
* initializes the setup generator
*/
public GenerateSetup() {
super();
}
/**
* sets the version number
*
* @param value the version number
*/
public void setVersion(String value) {
mVersion = value;
}
/**
* sets the input directory
*
* @param value the dir
*/
public void setInputDir(String value) {
mInputDir = value;
}
/**
* sets the output directory
*
* @param value the dir
*/
public void setOutputDir(String value) {
mOutputDir = value;
}
/**
* sets the directory for Weka used in the setup
*
* @param value the dir
*/
public void setDir(String value) {
mDir = value;
}
/**
* sets the link prefix
*
* @param value the prefix
*/
public void setLinkPrefix(String value) {
mLinkPrefix = value;
}
/**
* sets the JRE filename
*
* @param value the filename
*/
public void setJRE(String value) {
mJRE = value;
}
/**
* writes the given vector to the specified file
*
* @param content the content to write
* @param filename the file to write to
* @return if writing was successful
*/
protected static boolean writeToFile(Vector content, String filename) {
StringBuffer contentStr;
int i;
contentStr = new StringBuffer();
for (i = 0; i < content.size(); i++)
contentStr.append(content.get(i).toString() + "\n");
return writeToFile(contentStr.toString(), filename);
}
/**
* writes the given content to the specified file
*
* @param content the content to write
* @param filename the file to write to
* @return if writing was successful
*/
protected static boolean writeToFile(String content, String filename) {
BufferedWriter writer;
boolean result;
File file;
result = true;
try {
// do we need to create dir?
file = new File(filename);
if (!file.getParentFile().exists())
file.getParentFile().mkdirs();
// content
writer = new BufferedWriter(new FileWriter(file));
writer.write(content);
writer.flush();
writer.close();
}
catch (Exception e) {
e.printStackTrace();
result = false;
}
return result;
}
/**
* indents the given string by count spaces and returns it
*
* @param line the string to indent
* @param count the number of spaces
* @return the indented string
*/
protected String indent(String line, int count) {
String result;
int i;
result = line;
for (i = 0; i < count; i++)
result = " " + result;
return result;
}
/**
* replaces code blocks, surrounded by "# Start: identifier" and
* "# End: identifier" with the given content and returns the new
* list
*
* @param lines the current text
* @param identifier the identifier to look for
* @param content the new content between the start/end comment
* @return the new text
*/
protected Vector replaceBlock(Vector lines, String identifier, String content) {
Vector result;
String start;
String end;
int i;
boolean skip;
result = new Vector();
start = "# Start: " + identifier;
end = "# End: " + identifier;
skip = false;
for (i = 0; i < lines.size(); i++) {
if (lines.get(i).toString().indexOf(start) > -1) {
result.add(lines.get(i).toString());
if (content.length() == 0)
result.add(
indent("# removed", lines.get(i).toString().indexOf(start)));
else
result.add(content);
skip = true;
continue;
}
else if (lines.get(i).toString().indexOf(end) > -1) {
result.add(lines.get(i).toString());
skip = false;
continue;
}
else {
if (!skip)
result.add(lines.get(i).toString());
}
}
return result;
}
/**
* loads the file and returns the lines in a Vector
*
* @param filename the file to load
* @return the content of the file
*/
public Vector loadFile(String filename) {
Vector result;
BufferedReader reader;
String line;
result = new Vector();
try {
reader = new BufferedReader(new FileReader(filename));
while ((line = reader.readLine()) != null)
result.add(line);
}
catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* generates the setup file
*
* @return true if generation was successful
*/
protected boolean generateSetupFile() {
Vector setup;
String block;
String versionHyphen;
versionHyphen = mVersion.replaceAll("\\.", "-");
// load file
setup = loadFile(TEMPLATES + "/" + "setup.nsi");
// Weka
block = "";
block += "!define WEKA_WEKA \"Weka\"\n";
block += "!define WEKA_VERSION \"" + mVersion + "\"\n";
block += "!define WEKA_VERSION_HYPHEN \"" + versionHyphen + "\"\n";
block += "!define WEKA_FILES \"" + new File(mInputDir).getAbsolutePath() + "\"\n";
block += "!define WEKA_TEMPLATES \"" + new File(TEMPLATES).getAbsolutePath() + "\"\n";
block += "!define WEKA_LINK_PREFIX \"" + mLinkPrefix + "\"\n";
block += "!define WEKA_DIR \"" + mDir + "\"\n";
block += "!define WEKA_URL \"http://www.cs.waikato.ac.nz/~ml/weka/\"\n";
block += "!define WEKA_MLGROUP \"Machine Learning Group, University of Waikato, Hamilton, NZ\"\n";
block += "!define WEKA_HEADERIMAGE \"" + new File(IMAGES + "/weka_new.bmp").getAbsolutePath() + "\"\n";
block += "!define WEKA_JRE \"" + new File(mJRE).getAbsolutePath() + "\"\n";
block += "!define WEKA_JRE_TEMP \"jre_setup.exe\"\n";
block += "!define WEKA_JRE_INSTALL \"RunJREInstaller.bat\"\n";
if (mJRE.length() != 0)
block += "!define WEKA_JRE_SUFFIX \"jre\"";
else
block += "!define WEKA_JRE_SUFFIX \"\"";
setup = replaceBlock(setup, "Weka", block);
// no JRE?
if (mJRE.length() == 0)
setup = replaceBlock(setup, "JRE", "");
// write file
if (mJRE.length() != 0)
return writeToFile(
setup,
mOutputDir + "/weka-" + versionHyphen + "jre.nsi");
else
return writeToFile(
setup,
mOutputDir + "/weka-" + versionHyphen + ".nsi");
}
/**
* generates the output
*
* @return true if generation was successful
*/
public boolean execute() {
boolean result;
result = true;
if (result)
result = generateSetupFile();
return result;
}
/**
* returns the value for the given option
*
* @param option the option to retrieve the value for (excluding "-")
* @param list the commandline options
* @return the value of the option, can be empty
*/
protected static String getOption(String option, String[] list) {
String result;
int i;
result = "";
for (i = 0; i < list.length - 1; i++) {
if (list[i].equals("-" + option)) {
result = list[i + 1];
break;
}
}
return result;
}
/**
* runs the generator with the necessary parameters.
*
* @param args the commandline parameters
* @throws Exception if something goes wrong
*/
public static void main(String[] args) throws Exception {
GenerateSetup generator;
generator = new GenerateSetup();
generator.setVersion(getOption("version", args));
generator.setInputDir(getOption("input-dir", args));
generator.setOutputDir(getOption("output-dir", args));
generator.setDir(getOption("dir", args));
generator.setLinkPrefix(getOption("link-prefix", args));
generator.setJRE(getOption("jre", args));
System.out.println("Result = " + generator.execute());
}
}