/* JSmooth: a VM wrapper toolkit for Windows Copyright (C) 2003 Rodrigo Reyes 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. */ package net.charabia.jsmoothgen.application; import java.io.File; import net.charabia.jsmoothgen.skeleton.SkeletonBean; /** * @author Rodrigo */ public class PropertiesBuilder { /** * Creates a text containing all the relevant properties of a * JSmoothModelBean object. The properties are output in the form * "key=value". *

*

* Note that all the paths are converted to be made relative to * the basedir parameter provided. All the paths converted are * expected to be relative to the targetted executable binary * (before the conversion is applied, that is). */ static public String makeProperties(File basedir, JSmoothModelBean obj) { StringBuffer out = new StringBuffer(); addPair("arguments", obj.getArguments(), out); addPair("mainclassname", obj.getMainClassName(), out); addPair("jvmsearch", makePathConc(obj.getJVMSearchPath()), out); addPair("minversion", obj.getMinimumVersion(), out); addPair("maxversion", obj.getMaximumVersion(), out); addPair("currentdir", obj.getCurrentDirectory(), out); if (obj.getEmbeddedJar() && (obj.getJarLocation().trim().length() > 0)) { addPair("embedjar", "true", out); } else { addPair("embedjar", "false", out); } if (obj.getMaximumMemoryHeap() > 1) { addPair("maxheap", Integer.toString(obj.getMaximumMemoryHeap()), out); } if (obj.getInitialMemoryHeap() > 1) { addPair("initialheap", Integer.toString(obj.getInitialMemoryHeap()), out); } if ((obj.getVmParameter() != null) && (!obj.getVmParameter().isEmpty())) { addPair("vmparameter", obj.getVmParameter(), out); } // BundledVM & classpaths are changed to be accessible // from the current directory File curdir = new File(obj.getExecutableName()).getParentFile(); if (curdir == null) curdir = basedir.getAbsoluteFile(); if (curdir.isAbsolute() == false) { curdir = new File(basedir, curdir.toString()); } // System.out.println("... curdir1 : " + curdir.toString()); if (obj.getCurrentDirectory() != null) { File newcurdir = new File(obj.getCurrentDirectory()); // System.out.println("... curdir1.5 : " + obj.getCurrentDirectory()); if (!"${EXECUTABLEPATH}".equalsIgnoreCase(obj.getCurrentDirectory())) { if (newcurdir.isAbsolute() == false) { curdir = new File(curdir, newcurdir.toString()); } else curdir = newcurdir; } } // System.out.println("... curdir2 : " + curdir.toString()); if (obj.getBundledJVMPath() != null) addPair("bundledvm", getRenormalizedPathIfNeeded(obj.getBundledJVMPath(), basedir, curdir), out); if (obj.getClassPath() != null) { String[] relcp = new String[obj.getClassPath().length]; for (int i = 0; i < relcp.length; i++) { relcp[i] = getRenormalizedPathIfNeeded(obj.getClassPath()[i], basedir, curdir); } addPair("classpath", makePathConc(relcp), out); } // // Adds all the skeleton-specific properties // if (obj.getSkeletonProperties() != null) { for (int i = 0; i < obj.getSkeletonProperties().length; i++) { JSmoothModelBean.Property prop = obj.getSkeletonProperties()[i]; if (prop.getKey() != null) { String val = prop.getValue(); if (val == null) val = ""; addPair("skel_" + prop.getKey(), val, out); } } } // // Adds all the java properties. Those properties are // typically passed as -Dname=value arguments for the sun's // JVM. // JavaPropertyPair[] javapairs = obj.getJavaProperties(); if (javapairs != null) { addPair("javapropertiescount", new Integer(javapairs.length).toString(), out); for (int i = 0; i < javapairs.length; i++) { addPair("javaproperty_name_" + i, javapairs[i].getName(), out); addPair("javaproperty_value_" + i, javapairs[i].getValue(), out); } } return out.toString(); } /** * Create a manifest entry for windows right elevation * * @param data * @param skel * @return the manifest xml */ public static String makeManifest(JSmoothModelBean data, SkeletonBean skel) { StringBuilder retVal = new StringBuilder(); String platform = "x86"; String shortName = skel.getShortName(); if (shortName.contains("64")) { platform = "ia64"; } retVal.append("").append("\n"); retVal.append("").append("\n"); retVal.append(" ").append("\n"); retVal.append(" ").append("\n"); retVal.append(" ").append("\n"); retVal .append( " ") .append("\n"); retVal.append(" ").append("\n"); retVal.append(" ").append("\n"); if (data.isUacRequireAdmin()) { retVal.append(" ").append("\n"); retVal.append(" ").append("\n"); retVal.append(" ").append("\n"); retVal.append(" ").append("\n"); retVal.append(" ").append("\n"); retVal.append(" ").append("\n"); retVal.append(" ").append("\n"); } retVal.append(""); return retVal.toString(); } /** * Converts a path relative to previousbasedir into a path * relative to newbasedir. */ static public String getRenormalizedPathIfNeeded(String value, File previousbasedir, File newbasedir) { // File f = new File(value); // if (f.isAbsolute()) // return value; if (newbasedir == null) return value; if (value == null) return ""; File abs = new File(previousbasedir, value).getAbsoluteFile(); File n = JSmoothModelPersistency.makePathRelativeIfPossible(newbasedir, abs); return n.toString(); } static public String escapeString(String str) { if (str == null) return ""; StringBuffer out = new StringBuffer(); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); switch (c) { case '\n': out.append("\\n"); break; case '\t': out.append("\\t"); break; case '\r': out.append("\\r"); break; case '\\': out.append("\\\\"); break; default: out.append(c); } } return out.toString(); } static private void addPair(String name, String value, StringBuffer out) { out.append(escapeString(name)); out.append("="); out.append(escapeString(value)); out.append("\n"); } static public String makePathConc(String[] elements) { StringBuffer buf = new StringBuffer(); if (elements != null) for (int i = 0; i < elements.length; i++) { buf.append(elements[i]); if ((i + 1) < elements.length) buf.append(";"); } return buf.toString(); } }