/*
* OperatingSystem.java
*
* Originally written by Slava Pestov for the jEdit installer project. This work
* has been placed into the public domain. You may use this work in any way and
* for any purpose you wish.
*
* THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
* IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
* _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
* OR REDISTRIBUTION OF THIS SOFTWARE.
*/
package installer;
import java.io.*;
import java.util.Vector;
/*
* Abstracts away operating-specific stuff, like finding out the installation
* directory, creating a shortcut to start to program, and such.
*/
public abstract class OperatingSystem
{
public abstract String getInstallDirectory(String name, String version);
public abstract static class OSTask
{
protected Install installer;
protected String name;
protected String label;
protected String directory;
protected boolean enabled;
public OSTask(Install installer, String name)
{
this.installer = installer;
this.name = name;
this.label = installer.getProperty("ostask." + name + ".label");
this.directory = getDefaultDirectory(installer);
// on by default
enabled = true;
}
public String getName()
{
return name;
}
public String getLabel()
{
return label;
}
public String getDefaultDirectory(Install installer)
{
return null;
}
public String getDirectory()
{
return directory;
}
public boolean isEnabled()
{
return enabled;
}
public void setEnabled(boolean enabled)
{
this.enabled = enabled;
}
public void setDirectory(String directory)
{
this.directory = directory;
}
public abstract void perform(String installDir,
Vector filesets) throws IOException;
}
public OSTask[] getOSTasks(Install installer)
{
return new OSTask[0];
}
public void mkdirs(String directory) throws IOException
{
File file = new File(directory);
if(!file.exists())
file.mkdirs();
}
public static OperatingSystem getOperatingSystem()
{
if(os != null)
return os;
if(System.getProperty("mrj.version") != null)
{
os = new MacOS();
}
else
{
String osName = System.getProperty("os.name");
if(osName.indexOf("Windows") != -1)
os = new Windows();
else if(osName.indexOf("OS/2") != -1)
os = new HalfAnOS();
else if(osName.indexOf("VMS") != -1)
os = new VMS();
else
os = new Unix();
}
return os;
}
public static class Unix extends OperatingSystem
{
public String getInstallDirectory(String name, String version)
{
String dir = "/usr/local/share/";
if(!new File(dir).canWrite())
{
dir = System.getProperty("user.home");
}
return new File(dir,name + "/" + version).getPath();
}
public String getExtraClassPath()
{
return "";
}
public class ScriptOSTask extends OSTask
{
public ScriptOSTask(Install installer)
{
super(installer,"unix-script");
}
public String getDefaultDirectory(Install installer)
{
String dir = "/usr/local/";
if(!new File(dir).canWrite())
{
dir = System.getProperty("user.home");
}
return new File(dir,"bin").getPath();
}
public void perform(String installDir,
Vector filesets) throws IOException
{
if(!enabled)
{
return;
}
mkdirs(directory);
// create app start script
String name = installer.getProperty("app.name");
String script = directory + File.separatorChar
+ name.toLowerCase();
// Delete existing copy
new File(script).delete();
// Write simple script
FileWriter out = new FileWriter(script);
out.write("#!/bin/sh\n");
out.write("#\n");
out.write("# Runs jEdit - Programmer's Text Editor.\n");
out.write("#\n");
out.write("\n");
out.write("# Find a java installation.\n");
out.write("if [ -z \"${JAVA_HOME}\" ]; then\n");
out.write(" echo 'Warning: $JAVA_HOME environment variable not set! Consider setting it.'\n");
out.write(" echo ' Attempting to locate java...'\n");
out.write(" j=`which java 2>/dev/null`\n");
out.write(" if [ -z \"$j\" ]; then\n");
out.write(" echo \"Failed to locate the java virtual machine! Bailing...\"\n");
out.write(" exit 1\n");
out.write(" else\n");
out.write(" echo \"Found a virtual machine at: $j...\"\n");
out.write(" JAVA=\"$j\"\n");
out.write(" fi\n");
out.write("else\n");
out.write(" JAVA=\"${JAVA_HOME}/bin/java\"\n");
out.write("fi\n");
out.write("\n");
out.write("# Launch application.\n");
out.write("\n");
out.write("exec \"${JAVA}\" -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -jar \""
+ installDir + File.separator
+ "jedit.jar\" -reuseview \"$@\"\n");
out.close();
// Make it executable
String[] chmodArgs = { "chmod", "755", script };
exec(chmodArgs);
}
}
public class ManPageOSTask extends OSTask
{
public ManPageOSTask(Install installer)
{
super(installer,"unix-man");
}
public String getDefaultDirectory(Install installer)
{
String dir = "/usr/local/";
if(!new File(dir).canWrite())
dir = System.getProperty("user.home");
return new File(dir,"man/man1").getPath();
}
public void perform(String installDir,
Vector filesets) throws IOException
{
if(!enabled)
return;
mkdirs(directory);
String name = installer.getProperty("app.name");
// install man page
String manpage = installer.getProperty("ostask.unix-man.manpage");
InputStream in = getClass().getResourceAsStream("/" + manpage);
installer.copy(in,new File(directory,manpage).getPath(),
null);
}
}
public OSTask[] getOSTasks(Install installer)
{
return new OSTask[] { new ScriptOSTask(installer),
new ManPageOSTask(installer) };
}
public void mkdirs(String directory) throws IOException
{
File file = new File(directory);
if(!file.exists())
{
String[] mkdirArgs = { "mkdir", "-m", "755",
"-p", directory };
exec(mkdirArgs);
}
}
public void exec(String[] args) throws IOException
{
Process proc = Runtime.getRuntime().exec(args);
proc.getInputStream().close();
proc.getOutputStream().close();
proc.getErrorStream().close();
try
{
proc.waitFor();
}
catch(InterruptedException ie)
{
}
}
}
public static class MacOS extends Unix
{
public String getInstallDirectory(String name, String version)
{
return "/Applications/" + name + " " + version;
}
public String getExtraClassPath()
{
return "/System/Library/Java/:";
}
}
public static class Windows extends OperatingSystem
{
public String getInstallDirectory(String name, String version)
{
String programDir = System.getenv("ProgramFiles");
// Here is a workaround for the case that the environment
// variable is not defined. Windows 98 and ME are known as
// such environments. This makes sense while jEdit supports
// JRE 5. JRE 6 doesn't support Windows 98 and ME.
if(programDir == null)
{
// This is a hint for what is needed here.
programDir = "%ProgramFiles%";
}
return programDir + "\\" + name + " " + version;
}
public class JEditLauncherOSTask extends OSTask
{
public JEditLauncherOSTask(Install installer)
{
super(installer,"jedit-launcher");
}
public String getDefaultDirectory(Install installer)
{
return null;
}
public void perform(String installDir,
Vector filesets)
{
if(!enabled
|| !filesets.contains("jedit-windows"))
return;
// run jEditLauncher installation
File executable = new File(installDir,"jedit.exe");
if(!executable.exists())
return;
String[] args = { executable.getPath(), "/i",
System.getProperty("java.home")
+ File.separator
+ "bin" };
try
{
Runtime.getRuntime().exec(args).waitFor();
}
catch(IOException io)
{
}
catch(InterruptedException ie)
{
}
}
}
public OSTask[] getOSTasks(Install installer)
{
return new OSTask[] { /* new JEditLauncherOSTask(installer) */ };
}
}
public static class HalfAnOS extends OperatingSystem
{
public String getInstallDirectory(String name, String version)
{
return "C:\\" + name + " " + version;
}
}
public static class VMS extends OperatingSystem
{
public String getInstallDirectory(String name, String version)
{
return "./" + name.toLowerCase() + "/" + version;
}
}
// private members
private static OperatingSystem os;
}
¤ Dauer der Verarbeitung: 0.0 Sekunden
(vorverarbeitet)
¤
|
Haftungshinweis
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.
|