/****************************************************************************************************************************
* Methode registriert eine Dateiendung mit einem java programm
* Also die Dateiendung ruft implizit eine .jar Datei auf mit der eigentlichen Datei als 1ten Übergabeparameter
* @param file_end_suffix String Dateindung von dem neuen Typen (ohne .)
* @param path_to_java_program String Java Programm das via java -jar programm.jar aufgerufen wird
* @param optional_icon String optionales Bild was bei der neuen Dateiendung gesetzt werden kann
* ACHTUNG Damit das Bild angezeigt wird, muss entweder der PC neugestartet werden oder der explorer neu gestartet werden
* @throws FileNotFoundException wenn der Java Interpreter nicht gefunden wurde, das jar File oder das Icon (wenn nicht null)
***************************************************************************************************************************/
public static void registerJavaProgram(String file_end_suffix, String path_to_java_program, String optional_icon) throws FileNotFoundException
{
if(file_end_suffix == null)
throw new NullPointerException("Suffix cannot be null");
if(file_end_suffix.startsWith("."))
throw new IllegalArgumentException("Suffix has to be declared without leading point (for example: xyz and not .xyz)\nYours: " + file_end_suffix);
if(path_to_java_program == null)
throw new NullPointerException("Java program cannot be null");
if(!path_to_java_program.endsWith(".jar"))
throw new IllegalArgumentException("Java programm must be a jar file: " + path_to_java_program);
if(!new File(path_to_java_program).exists())
throw new FileNotFoundException("Java programm cannot be found at: " + path_to_java_program);
if(optional_icon != null && !new File(optional_icon).exists())
throw new FileNotFoundException("Icon cannot be found at: " + optional_icon);
String _home = System.getProperty("java.home");
if(!_home.endsWith(File.separator))
_home = _home.concat(File.separator); //hängt einen backslash hinten dazu
_home = _home.concat("bin" + File.separator + "java.exe"); //hier javaw.exe reinschreiben, wenn die gewünscht ist
if(!new File(_home).exists())
throw new FileNotFoundException("java interpreter not found at: " + _home);
String HCR = "[HKEY_CLASSES_ROOT\\.";
//dadurch das replaceAll mit regex arbeitet und einmal \\ == \ im string müssen wir \\\\ für 2 \\ das regex kapiert, das ich einen backslash meine
_home = _home.replaceAll("\\\\","\\\\\\\\"); //alle \ gehören durch doppelte \\ ersetzt
path_to_java_program = path_to_java_program.replaceAll("\\\\","\\\\\\\\");
if(optional_icon != null)
optional_icon = optional_icon.replaceAll("\\\\","\\\\\\\\"); //auch hier alle Backslashes durch doppelte ersetzen
try{
File exFile = File.createTempFile("progregister",".tmp");
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(exFile)));
bw.write("Windows Registry Editor Version 5.00");
bw.newLine();
bw.newLine();
bw.write(new StringBuffer(HCR).append(file_end_suffix).append("]").toString());
bw.newLine();
bw.newLine();
bw.write(new StringBuffer(HCR).append(file_end_suffix).append("\\Shell]").toString());
bw.newLine();
bw.newLine();
bw.write(new StringBuffer(HCR).append(file_end_suffix).append("\\Shell\\Open]").toString());
bw.newLine();
bw.newLine();
bw.write(new StringBuffer(HCR).append(file_end_suffix).append("\\Shell\\Open\\Command]").toString());
bw.newLine();
bw.write(new StringBuffer("@=\"").append(_home).append(" -jar ").append(path_to_java_program).append(" %1 \"").toString());
if(optional_icon != null)
{
bw.newLine();
bw.newLine();
bw.write(new StringBuffer(HCR).append(file_end_suffix).append("\\DefaultIcon]").toString());
bw.newLine();
bw.write(new StringBuffer("@=\"").append(optional_icon).append("\"").toString());
}
bw.flush();
bw.close(); //schließt das File
Runtime.getRuntime().exec("regedit /s " + exFile.getAbsolutePath()).waitFor(); //speichert den Eintrag in der registry
if(!exFile.delete())
exFile.deleteOnExit();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}