package org.squidy.manager.os; import java.io.BufferedReader; import java.io.File; import java.io.FileWriter; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URISyntaxException; /** * <code>RunOnSystemStartup</code>. * * <pre> * Date: Aug 6, 2010 * Time: 7:53:42 AM * </pre> * * @author Roman Rädle, <a * href="mailto:Roman.Raedle@uni-konstanz.de">Roman. * Raedle@uni-konstanz.de</a>, University of Konstanz * @version $Id$ * @since 1.5.0 */ public class RunOnSystemStartup { /* * Constants */ protected final static String osName = System.getProperty("os.name"); protected final static String fileSeparator = System .getProperty("file.separator"); protected final static String javaHome = System.getProperty("java.home"); protected final static String userHome = System.getProperty("user.home"); /* * Debugging */ protected static boolean debugOutput = false; protected static void debug(String message) { if (debugOutput) { System.err.println(message); System.err.flush(); } } /* * Helpers */ protected static File getJarFile() throws URISyntaxException { return new File(RunOnSystemStartup.class.getProtectionDomain() .getCodeSource().getLocation().toURI()); } protected static File getStartupFile() throws Exception { debug("RunOnSystemStartup.getStartupFile: osName=\"" + osName + "\""); if (osName.startsWith("Windows")) { Process process = Runtime .getRuntime() .exec( "reg query \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\" /v Startup"); BufferedReader in = new BufferedReader(new InputStreamReader( process.getInputStream())); String result = "", line; while ((line = in.readLine()) != null) { result += line; } in.close(); result = result.replaceAll(".*REG_SZ[ ]*", ""); debug("RunOnSystemStartup.getStartupFile: Startup Directory=\"" + result + "\""); return new File(result + fileSeparator + getJarFile().getName().replaceFirst(".jar", ".bat")); } else if (osName.startsWith("Mac OS")) { return new File(userHome + "/Library/LaunchAgents/com.mksoft." + getJarFile().getName().replaceFirst(".jar", ".plist")); } else { throw new Exception("Unknown Operating System Name \"" + osName + "\""); } } /* * Methods */ /** * Returns whether this JAR file is installed to run on system startup. */ public static boolean isInstalled() throws Exception { return getStartupFile().exists(); } /** * Install the specified class from the current JAR file to run on system * startup. * * @param className * Name of class within the current JAR file to run on system * startup. * @param windowTitle * Title to display in window title bar, if applicable. */ public static void install(String className, String windowTitle) throws Exception { File startupFile = getStartupFile(); PrintWriter out = new PrintWriter(new FileWriter(startupFile)); if (osName.startsWith("Windows")) { out.println("@echo off"); out.println("start \"" + windowTitle + "\" \"" + javaHome + fileSeparator + "bin" + fileSeparator + "java.exe\" -cp " + getJarFile() + " " + className); } else if (osName.startsWith("Mac OS")) { out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); out.println("<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">"); out.println("<plist version=\"1.0\">"); out.println("<dict>"); out.println(" <key>Label</key>"); out.println(" <string>com.mksoft."+getJarFile().getName().replaceFirst(".jar","")+"</string>"); out.println(" <key>ProgramArguments</key>"); out.println(" <array>"); out.println(" <string>"+javaHome+fileSeparator+"bin"+fileSeparator+"java</string>"); out.println(" <string>-cp</string>"); out.println(" <string>"+getJarFile()+"</string>"); out.println(" <string>"+className+"</string>"); out.println(" </array>"); out.println(" <key>RunAtLoad</key>"); out.println(" <true/>"); out.println("</dict>"); out.println("</plist>"); } else { throw new Exception("Unknown Operating System Name \"" + osName + "\""); } out.close(); } /** * Uninstall this JAR file from the system startup process. */ public static void uninstall() throws Exception { File startupFile = getStartupFile(); if (startupFile.exists()) { startupFile.delete(); } } }