/*
Launch4j (http://launch4j.sourceforge.net/)
Cross-platform Java application wrapper for creating Windows native executables.
Copyright (C) 2004, 2006 Grzegorz Kowal
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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
* Created on Apr 22, 2005
*/
package net.sf.launch4j.config;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import net.sf.launch4j.Util;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
/**
* @author Copyright (C) 2005 Grzegorz Kowal
*/
public class ConfigPersister {
private static final ConfigPersister _instance = new ConfigPersister();
private final XStream _xstream;
private Config _config;
private File _configPath;
private ConfigPersister() {
_xstream = new XStream(new DomDriver());
_xstream.alias("launch4jConfig", Config.class);
_xstream.alias("jre", Jre.class);
_xstream.alias("splash", Splash.class);
_xstream.alias("versionInfo", VersionInfo.class);
_xstream.alias("file", String.class);
}
public static ConfigPersister getInstance() {
return _instance;
}
public Config getConfig() {
return _config;
}
public File getConfigPath() {
return _configPath;
}
public File getOutputPath() throws IOException {
if (_config.getOutfile().isAbsolute()) {
return _config.getOutfile().getParentFile();
}
File parent = _config.getOutfile().getParentFile();
return (parent != null) ? new File(_configPath, parent.getPath()) : _configPath;
}
public File getOutputFile() throws IOException {
return _config.getOutfile().isAbsolute()
? _config.getOutfile()
: new File(getOutputPath(), _config.getOutfile().getName());
}
public void createBlank() {
_config = new Config();
_config.setJre(new Jre());
_configPath = null;
}
public void setAntConfig(Config c, File basedir) {
_config = c;
_configPath = basedir;
}
public void load(File f) throws ConfigPersisterException {
try {
BufferedReader r = new BufferedReader(new FileReader(f));
_config = (Config) _xstream.fromXML(r);
r.close();
setConfigPath(f);
} catch (Exception e) {
throw new ConfigPersisterException(e);
}
}
/**
* Imports launch4j 1.x.x config file.
*/
public void loadVersion1(File f) throws ConfigPersisterException {
try {
Props props = new Props(f);
_config = new Config();
String header = props.getProperty(Config.HEADER);
_config.setHeaderType(header == null
|| header.toLowerCase().equals("guihead.bin") ? 0 : 1);
_config.setJar(props.getFile(Config.JAR));
_config.setOutfile(props.getFile(Config.OUTFILE));
_config.setJre(new Jre());
_config.getJre().setPath(props.getProperty(Jre.PATH));
_config.getJre().setMinVersion(props.getProperty(Jre.MIN_VERSION));
_config.getJre().setMaxVersion(props.getProperty(Jre.MAX_VERSION));
_config.getJre().setArgs(props.getProperty(Jre.ARGS));
_config.setJarArgs(props.getProperty(Config.JAR_ARGS));
_config.setChdir("true".equals(props.getProperty(Config.CHDIR)) ? "." : null);
_config.setCustomProcName("true".equals(
props.getProperty("setProcName"))); // 1.x
_config.setStayAlive("true".equals(props.getProperty(Config.STAY_ALIVE)));
_config.setErrTitle(props.getProperty(Config.ERR_TITLE));
_config.setIcon(props.getFile(Config.ICON));
File splashFile = props.getFile(Splash.SPLASH_FILE);
if (splashFile != null) {
_config.setSplash(new Splash());
_config.getSplash().setFile(splashFile);
String waitfor = props.getProperty("waitfor"); // 1.x
_config.getSplash().setWaitForWindow(waitfor != null && !waitfor.equals(""));
String splashTimeout = props.getProperty(Splash.TIMEOUT);
if (splashTimeout != null) {
_config.getSplash().setTimeout(Integer.parseInt(splashTimeout));
}
_config.getSplash().setTimeoutErr("true".equals(
props.getProperty(Splash.TIMEOUT_ERR)));
} else {
_config.setSplash(null);
}
setConfigPath(f);
} catch (IOException e) {
throw new ConfigPersisterException(e);
}
}
public void save(File f) throws ConfigPersisterException {
try {
BufferedWriter w = new BufferedWriter(new FileWriter(f));
_xstream.toXML(_config, w);
w.close();
setConfigPath(f);
} catch (Exception e) {
throw new ConfigPersisterException(e);
}
}
private void setConfigPath(File configFile) {
_configPath = configFile.getAbsoluteFile().getParentFile();
}
private class Props {
final Properties _properties = new Properties();
public Props(File f) throws IOException {
FileInputStream is = null;
try {
is = new FileInputStream(f);
_properties.load(is);
} finally {
Util.close(is);
}
}
/**
* Get property and remove trailing # comments.
*/
public String getProperty(String key) {
String p = _properties.getProperty(key);
if (p == null) {
return null;
}
int x = p.indexOf('#');
if (x == -1) {
return p;
}
do {
x--;
} while (x > 0 && (p.charAt(x) == ' ' || p.charAt(x) == '\t'));
return (x == 0) ? "" : p.substring(0, x + 1);
}
public File getFile(String key) {
String value = getProperty(key);
return value != null ? new File(value) : null;
}
}
}