diff options
author | Jiri Vanek <[email protected]> | 2013-04-12 13:31:49 +0200 |
---|---|---|
committer | Jiri Vanek <[email protected]> | 2013-04-12 13:31:49 +0200 |
commit | 2f1248e599ff30dc01d6d1d7361fc0f4331a1b68 (patch) | |
tree | 84e64629330eda098b217309ccc2af14b30a16db /netx/net/sourceforge | |
parent | d72aa240b794c81d4ec9aea24158564e696173a9 (diff) |
Added dialogue to allow setting of custom JRE
Diffstat (limited to 'netx/net/sourceforge')
7 files changed, 374 insertions, 11 deletions
diff --git a/netx/net/sourceforge/jnlp/config/Defaults.java b/netx/net/sourceforge/jnlp/config/Defaults.java index 9e51d78..1191e9e 100644 --- a/netx/net/sourceforge/jnlp/config/Defaults.java +++ b/netx/net/sourceforge/jnlp/config/Defaults.java @@ -391,6 +391,12 @@ public class Defaults { DeploymentConfiguration.KEY_SECURITY_LEVEL, new SecurityValueValidator(), null + }, + //JVM executable for itw + { + DeploymentConfiguration.KEY_JRE_DIR, + null, + null } }; diff --git a/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java b/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java index 98dc88b..61061d2 100644 --- a/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java +++ b/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java @@ -166,6 +166,7 @@ public final class DeploymentConfiguration { * JVM arguments for plugin */ public static final String KEY_PLUGIN_JVM_ARGUMENTS= "deployment.plugin.jvm.arguments"; + public static final String KEY_JRE_DIR= "deployment.jre.dir"; public enum ConfigType { System, User @@ -178,6 +179,10 @@ public final class DeploymentConfiguration { private File systemPropertiesFile = null; /** The user's deployment.config file */ private File userPropertiesFile = null; + + /*default user file*/ + public static final File USER_DEPLOYMENT_PROPERTIES_FILE = new File(System.getProperty("user.home") + File.separator + DEPLOYMENT_DIR + + File.separator + DEPLOYMENT_PROPERTIES); /** the current deployment properties */ private Map<String, Setting<String>> currentConfiguration; @@ -221,8 +226,7 @@ public final class DeploymentConfiguration { */ public void load(boolean fixIssues) throws ConfigurationException { // make sure no state leaks if security check fails later on - File userFile = new File(System.getProperty("user.home") + File.separator + DEPLOYMENT_DIR - + File.separator + DEPLOYMENT_PROPERTIES); + File userFile = new File(USER_DEPLOYMENT_PROPERTIES_FILE.getAbsolutePath()); SecurityManager sm = System.getSecurityManager(); if (sm != null) { @@ -415,8 +419,25 @@ public final class DeploymentConfiguration { return etcFile; } - File jreFile = new File(System.getProperty("java.home") + File.separator + "lib" - + File.separator + DEPLOYMENT_CONFIG); + String jrePath = null; + try { + Map<String, Setting<String>> tmpProperties = parsePropertiesFile(USER_DEPLOYMENT_PROPERTIES_FILE); + Setting<String> jreSetting = tmpProperties.get(KEY_JRE_DIR); + if (jreSetting != null) { + jrePath = jreSetting.getValue(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + + File jreFile; + if (jrePath != null) { + jreFile = new File(jrePath + File.separator + "lib" + + File.separator + DEPLOYMENT_CONFIG); + } else { + jreFile = new File(System.getProperty("java.home") + File.separator + "lib" + + File.separator + DEPLOYMENT_CONFIG); + } if (jreFile.isFile()) { return jreFile; } diff --git a/netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java b/netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java index d56cfba..7def7b5 100644 --- a/netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java +++ b/netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java @@ -53,6 +53,7 @@ import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; +import net.sourceforge.jnlp.controlpanel.JVMPanel.JvmValidationResult; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.security.KeyStores; import net.sourceforge.jnlp.security.viewer.CertificatePane; @@ -66,6 +67,7 @@ import net.sourceforge.jnlp.util.ImageResources; * */ public class ControlPanel extends JFrame { + private JVMPanel jvmPanel; /** * Class for keeping track of the panels and their associated text. @@ -157,6 +159,21 @@ public class ControlPanel extends JFrame { topPanel.setBorder(new EmptyBorder(10, 10, 10, 10)); return topPanel; } + + private int validateJdk() { + String s = ControlPanel.this.config.getProperty(DeploymentConfiguration.KEY_JRE_DIR); + JvmValidationResult validationResult = JVMPanel.validateJvm(s); + if (validationResult.id == JvmValidationResult.STATE.NOT_DIR + || validationResult.id == JvmValidationResult.STATE.NOT_VALID_DIR + || validationResult.id == JvmValidationResult.STATE.NOT_VALID_JDK) { + return JOptionPane.showConfirmDialog(ControlPanel.this, + "<html>"+Translator.R("CPJVMNotokMessage1", s)+"<br>" + + validationResult.formattedText+"<br>" + + Translator.R("CPJVMNotokMessage2", DeploymentConfiguration.KEY_JRE_DIR, DeploymentConfiguration.USER_DEPLOYMENT_PROPERTIES_FILE)+"</html>", + Translator.R("CPJVMconfirmInvalidJdkTitle"),JOptionPane.OK_CANCEL_OPTION); + } + return JOptionPane.OK_OPTION; + } /** * Creates the "ok" "apply" and "cancel" buttons. @@ -173,6 +190,10 @@ public class ControlPanel extends JFrame { @Override public void actionPerformed(ActionEvent e) { ControlPanel.this.saveConfiguration(); + int validationResult = validateJdk(); + if (validationResult!= JOptionPane.OK_OPTION){ + return; + } ControlPanel.this.dispose(); } }); @@ -183,6 +204,15 @@ public class ControlPanel extends JFrame { @Override public void actionPerformed(ActionEvent e) { ControlPanel.this.saveConfiguration(); + int validationResult = validateJdk(); + if (validationResult != JOptionPane.OK_OPTION) { + int i = JOptionPane.showConfirmDialog(ControlPanel.this, + Translator.R("CPJVMconfirmReset"), + Translator.R("CPJVMconfirmReset"), JOptionPane.OK_CANCEL_OPTION); + if (i == JOptionPane.OK_OPTION) { + jvmPanel.resetTestFieldArgumentsExec(); + } + } } }); buttons.add(applyButton); @@ -219,7 +249,7 @@ public class ControlPanel extends JFrame { * @return A panel with all the components in place. */ private JPanel createMainSettingsPanel() { - + jvmPanel = (JVMPanel) createJVMSettingsPanel(); SettingsPanel[] panels = new SettingsPanel[] { new SettingsPanel(Translator.R("CPTabAbout"), createAboutPanel()), new SettingsPanel(Translator.R("CPTabCache"), createCacheSettingsPanel()), new SettingsPanel(Translator.R("CPTabCertificate"), createCertificatesSettingsPanel()), @@ -227,7 +257,7 @@ public class ControlPanel extends JFrame { // new SettingsPanel(Translator.R("CPTabClassLoader"), createClassLoaderSettingsPanel()), new SettingsPanel(Translator.R("CPTabDebugging"), createDebugSettingsPanel()), new SettingsPanel(Translator.R("CPTabDesktopIntegration"), createDesktopSettingsPanel()), - new SettingsPanel(Translator.R("CPTabJVMSettings"), createJVMSettingsPanel()), + new SettingsPanel(Translator.R("CPTabJVMSettings"),jvmPanel), new SettingsPanel(Translator.R("CPTabNetwork"), createNetworkSettingsPanel()), // TODO: This is commented out since this is not implemented yet // new SettingsPanel(Translator.R("CPTabRuntimes"), createRuntimesSettingsPanel()), diff --git a/netx/net/sourceforge/jnlp/controlpanel/JVMPanel.java b/netx/net/sourceforge/jnlp/controlpanel/JVMPanel.java index 91f5b1c..9f1dd52 100644 --- a/netx/net/sourceforge/jnlp/controlpanel/JVMPanel.java +++ b/netx/net/sourceforge/jnlp/controlpanel/JVMPanel.java @@ -40,17 +40,43 @@ import java.awt.Component; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; - +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JTextField; - +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.Document; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.Translator; +import net.sourceforge.jnlp.util.StreamUtils; @SuppressWarnings("serial") public class JVMPanel extends NamedBorderPanel { + + public static class JvmValidationResult { + + public static enum STATE { + + EMPTY, NOT_DIR, NOT_VALID_DIR, NOT_VALID_JDK, VALID_JDK; + } + public final String formattedText; + public final STATE id; + + public JvmValidationResult(String formattedText, STATE id) { + this.id = id; + this.formattedText = formattedText; + } + } private DeploymentConfiguration config; + private File lastPath = new File("/usr/lib/jvm/java/jre/"); + JTextField testFieldArgumentsExec; JVMPanel(DeploymentConfiguration config) { super(Translator.R("CPHeadJVMSettings"), new GridBagLayout()); @@ -58,23 +84,125 @@ public class JVMPanel extends NamedBorderPanel { addComponents(); } + + void resetTestFieldArgumentsExec(){ + testFieldArgumentsExec.setText(""); + } private void addComponents() { - JLabel description = new JLabel("<html>" + Translator.R("CPJVMPluginArguments") + "<hr /></html>"); - JTextField testFieldArguments = new JTextField(25); + final JLabel description = new JLabel("<html>" + Translator.R("CPJVMPluginArguments") + "<hr /></html>"); + final JTextField testFieldArguments = new JTextField(25); testFieldArguments.getDocument().addDocumentListener(new DocumentAdapter(config, DeploymentConfiguration.KEY_PLUGIN_JVM_ARGUMENTS)); testFieldArguments.setText(config.getProperty(DeploymentConfiguration.KEY_PLUGIN_JVM_ARGUMENTS)); + + final JLabel descriptionExec = new JLabel("<html>" + Translator.R("CPJVMitwExec") + "<hr /></html>"); + testFieldArgumentsExec = new JTextField(100); + final JLabel validationResult = new JLabel(resetValidationResult(testFieldArgumentsExec.getText(), "", "CPJVMnone")); + final JCheckBox allowTypoTimeValidation = new JCheckBox(Translator.R("CPJVMPluginAllowTTValidation"), true); + allowTypoTimeValidation.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + validationResult.setText(resetValidationResult(testFieldArgumentsExec.getText(), "", "CPJVMnone")); + } + }); + testFieldArgumentsExec.getDocument().addDocumentListener(new DocumentListener() { + + @Override + public void insertUpdate(DocumentEvent e) { + if (allowTypoTimeValidation.isSelected()) { + JvmValidationResult s = validateJvm(testFieldArgumentsExec.getText()); + validationResult.setText(resetValidationResult(testFieldArgumentsExec.getText(), s.formattedText, "CPJVMvalidated")); + } + } + + @Override + public void removeUpdate(DocumentEvent e) { + if (allowTypoTimeValidation.isSelected()) { + JvmValidationResult s = validateJvm(testFieldArgumentsExec.getText()); + validationResult.setText(resetValidationResult(testFieldArgumentsExec.getText(), s.formattedText, "CPJVMvalidated")); + } + } + + @Override + public void changedUpdate(DocumentEvent e) { + if (allowTypoTimeValidation.isSelected()) { + JvmValidationResult s = validateJvm(testFieldArgumentsExec.getText()); + validationResult.setText(resetValidationResult(testFieldArgumentsExec.getText(), s.formattedText, "CPJVMvalidated")); + } + } + }); + + testFieldArgumentsExec.getDocument().addDocumentListener(new DocumentAdapter(config, DeploymentConfiguration.KEY_JRE_DIR)); + testFieldArgumentsExec.setText(config.getProperty(DeploymentConfiguration.KEY_JRE_DIR)); + + final JButton selectJvm = new JButton(Translator.R("CPJVMPluginSelectExec")); + selectJvm.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JFileChooser jfch; + if (lastPath != null && lastPath.exists()) { + jfch = new JFileChooser(lastPath); + } else { + jfch = new JFileChooser(); + } + jfch.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + int i = jfch.showOpenDialog(JVMPanel.this); + if (i == JFileChooser.APPROVE_OPTION && jfch.getSelectedFile() != null) { + lastPath = jfch.getSelectedFile().getParentFile(); + String nws = jfch.getSelectedFile().getAbsolutePath(); + String olds = testFieldArgumentsExec.getText(); + if (!nws.equals(olds)) { + validationResult.setText(resetValidationResult(testFieldArgumentsExec.getText(), "", "CPJVMnone")); + } + testFieldArgumentsExec.setText(nws); + } + + } + }); + final JButton validateJvm = new JButton(Translator.R("CPJVMitwExecValidation")); + validateJvm.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JvmValidationResult s = validateJvm(testFieldArgumentsExec.getText()); + validationResult.setText(resetValidationResult(testFieldArgumentsExec.getText(), s.formattedText, "CPJVMvalidated")); + + } + }); + // Filler to pack the bottom of the panel. GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.weightx = 1; + c.gridwidth = 4; c.gridx = 0; c.gridy = 0; + c.insets = new Insets(2, 2, 4, 4); this.add(description, c); c.gridy++; this.add(testFieldArguments, c); + c.gridy++; + this.add(descriptionExec, c); + c.gridy++; + this.add(testFieldArgumentsExec, c); + c.gridy++; + GridBagConstraints cb1 = (GridBagConstraints) c.clone(); + cb1.fill = GridBagConstraints.NONE; + cb1.gridwidth = 1; + this.add(selectJvm, cb1); + GridBagConstraints cb3 = (GridBagConstraints) c.clone(); + cb3.fill = GridBagConstraints.NONE; + cb3.gridx = 2; + cb3.gridwidth = 1; + this.add(allowTypoTimeValidation, cb3); + GridBagConstraints cb2 = (GridBagConstraints) c.clone(); + cb2.fill = GridBagConstraints.NONE; + cb2.gridx = 3; + cb2.gridwidth = 1; + this.add(validateJvm, cb2); + c.gridy++; + this.add(validationResult, c); // This is to keep it from expanding vertically if resized. Component filler = Box.createRigidArea(new Dimension(1, 1)); @@ -82,4 +210,104 @@ public class JVMPanel extends NamedBorderPanel { c.weighty++; this.add(filler, c); } + + public static JvmValidationResult validateJvm(String cmd) { + if (cmd == null || cmd.trim().equals("")) { + return new JvmValidationResult("<span color=\"orange\">" + Translator.R("CPJVMvalueNotSet") + "</span>", + JvmValidationResult.STATE.EMPTY); + } + String validationResult = ""; + File jreDirFile = new File(cmd); + JvmValidationResult.STATE latestOne = JvmValidationResult.STATE.EMPTY; + if (jreDirFile.isDirectory()) { + validationResult += "<span color=\"green\">" + Translator.R("CPJVMisDir") + "</span><br />"; + } else { + validationResult += "<span color=\"red\">" + Translator.R("CPJVMnotDir") + "</span><br />"; + latestOne = JvmValidationResult.STATE.NOT_DIR; + } + File javaFile = new File(cmd + File.separator + "bin" + File.separator + "java"); + if (javaFile.isFile()) { + validationResult += "<span color=\"green\">" + Translator.R("CPJVMjava") + "</span><br />"; + } else { + validationResult += "<span color=\"red\">" + Translator.R("CPJVMnoJava") + "</span><br />"; + if (latestOne != JvmValidationResult.STATE.NOT_DIR) { + latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; + } + } + File rtFile = new File(cmd + File.separator + "lib" + File.separator + "rt.jar"); + if (rtFile.isFile()) { + validationResult += "<span color=\"green\">" + Translator.R("CPJVMrtJar") + "</span><br />"; + } else { + validationResult += "<span color=\"red\">" + Translator.R("CPJVMnoRtJar") + "</span><br />"; + if (latestOne != JvmValidationResult.STATE.NOT_DIR) { + latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; + } + } + ProcessBuilder sb = new ProcessBuilder(javaFile.getAbsolutePath(), "-version"); + Process p = null; + String processErrorStream = ""; + String processStdOutStream = ""; + Integer r = null; + try { + p = sb.start(); + p.waitFor(); + processErrorStream = StreamUtils.readStreamAsString(p.getErrorStream()); + processStdOutStream = StreamUtils.readStreamAsString(p.getInputStream()); + r = p.exitValue(); + System.err.println(processErrorStream); + System.out.println(processStdOutStream); + processErrorStream = processErrorStream.toLowerCase(); + processStdOutStream = processStdOutStream.toLowerCase(); + } catch (Exception ex) {; + ex.printStackTrace(); + + } + if (r == null) { + validationResult += "<span color=\"red\">" + Translator.R("CPJVMnotLaunched") + "</span>"; + if (latestOne != JvmValidationResult.STATE.NOT_DIR) { + latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; + } + return new JvmValidationResult(validationResult, latestOne); + } + if (r.intValue() != 0) { + validationResult += "<span color=\"red\">" + Translator.R("CPJVMnoSuccess") + "</span>"; + if (latestOne != JvmValidationResult.STATE.NOT_DIR) { + latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; + } + return new JvmValidationResult(validationResult, latestOne); + } + if (processErrorStream.contains("openjdk") || processStdOutStream.contains("openjdk")) { + validationResult += "<span color=\"#00EE00\">" + Translator.R("CPJVMopenJdkFound") + "</span>"; + return new JvmValidationResult(validationResult, JvmValidationResult.STATE.VALID_JDK); + } + if (processErrorStream.contains("ibm") || processStdOutStream.contains("ibm")) { + validationResult += "<span color=\"green\">" + Translator.R("CPJVMibmFound") + "</span>"; + if (latestOne != JvmValidationResult.STATE.NOT_DIR) { + latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; + } + return new JvmValidationResult(validationResult, latestOne); + } + if (processErrorStream.contains("gij") || processStdOutStream.contains("gij")) { + validationResult += "<span color=\"orange\">" + Translator.R("CPJVMgijFound") + "</span>"; + if (latestOne != JvmValidationResult.STATE.NOT_DIR) { + latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; + } + return new JvmValidationResult(validationResult, latestOne); + } + if (processErrorStream.contains("oracle") || processStdOutStream.contains("oracle") + || processErrorStream.contains("java(tm)") || processStdOutStream.contains("java(tm)")) { + validationResult += "<span color=\"green\">" + Translator.R("CPJVMoracleFound") + "</span>"; + if (latestOne != JvmValidationResult.STATE.NOT_DIR) { + latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; + } + return new JvmValidationResult(validationResult, latestOne); + } + validationResult += "<span color=\"orange\">" + Translator.R("CPJVMstrangeProcess") + "</span>"; + return new JvmValidationResult(validationResult, JvmValidationResult.STATE.NOT_VALID_JDK); + + } + + private String resetValidationResult(final String value, String result, String headerKey) { + return "<html>" + Translator.R(headerKey) + ": <br />" + value + " <br />" + result + "<hr /></html>"; + } } diff --git a/netx/net/sourceforge/jnlp/resources/Messages.properties b/netx/net/sourceforge/jnlp/resources/Messages.properties index f20277a..38d6334 100644 --- a/netx/net/sourceforge/jnlp/resources/Messages.properties +++ b/netx/net/sourceforge/jnlp/resources/Messages.properties @@ -312,6 +312,30 @@ CPSecurityDescription=Use this to configure security settings. CPDebuggingDescription=Enable options here to help with debugging CPDesktopIntegrationDescription=Set whether or not to allow creation of desktop shortcut. CPJVMPluginArguments=Set JVM arguments for plugin. +CPJVMitwExec=Set JVM for icedtea-web - working best with OpenJDK +CPJVMitwExecValidation=Validate JVM for icedtea-web +CPJVMPluginSelectExec=Select JVM for icedtea-web +CPJVMnone=No validation result for +CPJVMvalidated=Validation result for +CPJVMvalueNotSet=Value is not set. Hardcoded JVM will be used. +CPJVMnotLaunched=Error, process was not launched, see console output for more info. +CPJVMnoSuccess=Error, process have not ended successfully, see output for details, but your java is not set correctly. +CPJVMopenJdkFound=Excellent, OpenJDK detected +CPJVMoracleFound=Great, Oracle java detected +CPJVMibmFound=Good, IBM java detected +CPJVMgijFound=Warning, gij detected +CPJVMstrangeProcess=Your path had an executable process, but it was not recognized. Verify the Java version in the console output. +CPJVMnotDir=Error, The path you chose is not a directory. +CPJVMisDir=Ok, the path you chose is a directory. +CPJVMnoJava=Error, the directory you chose does not contain bin/java. +CPJVMjava=Ok, the directory you chose contains bin/java. +CPJVMnoRtJar=Error, the directory you chose does not contain lib/rt.jar +CPJVMrtJar=Ok, the directory you chose contains lib/rt.jar. +CPJVMPluginAllowTTValidation=Allow type-time validation +CPJVMNotokMessage1=You have entered invalid JDK value <u>({0})</u> with following error message: +CPJVMNotokMessage2=You might be seeing this message because: <blockquote> * Some validation has not been passed<br> * Non-OpenJDK is detected</blockquote>With invalid JDK IcedTea-Web will probably not be able to start.<br>You will have to modify or remove <u>{0}</u> property in your configuration file <u>{1}</u>. <br>You should try to search for OpenJDK in your system or be sure you know what you are doing. +CPJVMconfirmInvalidJdkTitle=Confirm invalid JDK +CPJVMconfirmReset=Reset to default? # Control Panel - Buttons CPButAbout=About... diff --git a/netx/net/sourceforge/jnlp/util/FileUtils.java b/netx/net/sourceforge/jnlp/util/FileUtils.java index 80a303a..804983d 100644 --- a/netx/net/sourceforge/jnlp/util/FileUtils.java +++ b/netx/net/sourceforge/jnlp/util/FileUtils.java @@ -176,6 +176,39 @@ public final class FileUtils { } } + if (JNLPRuntime.isWindows()) { + // remove all permissions + if (!tempFile.setExecutable(false, false)) { + System.err.println(R("RRemoveXPermFailed", tempFile)); + } + if (!tempFile.setReadable(false, false)) { + System.err.println(R("RRemoveRPermFailed", tempFile)); + } + if (!tempFile.setWritable(false, false)) { + System.err.println(R("RRemoveWPermFailed", tempFile)); + } + + // allow owner to read + if (!tempFile.setReadable(true, true)) { + System.err.println(R("RGetRPermFailed", tempFile)); + } + + // allow owner to write + if (writableByOwner && !tempFile.setWritable(true, true)) { + System.err.println(R("RGetWPermFailed", tempFile)); + } + + // allow owner to enter directories + if (isDir && !tempFile.setExecutable(true, true)) { + System.err.println(R("RGetXPermFailed", tempFile)); + } + // rename this file. Unless the file is moved/renamed, any program that + // opened the file right after it was created might still be able to + // read the data. + if (!tempFile.renameTo(file)) { + System.err.println(R("RCantRename", tempFile, file)); + } + } else { // remove all permissions if (!tempFile.setExecutable(false, false)) { throw new IOException(R("RRemoveXPermFailed", tempFile)); @@ -201,13 +234,15 @@ public final class FileUtils { if (isDir && !tempFile.setExecutable(true, true)) { throw new IOException(R("RGetXPermFailed", tempFile)); } - + // rename this file. Unless the file is moved/renamed, any program that // opened the file right after it was created might still be able to // read the data. if (!tempFile.renameTo(file)) { throw new IOException(R("RCantRename", tempFile, file)); } + } + } diff --git a/netx/net/sourceforge/jnlp/util/StreamUtils.java b/netx/net/sourceforge/jnlp/util/StreamUtils.java index 3a179d5..7dd7a92 100644 --- a/netx/net/sourceforge/jnlp/util/StreamUtils.java +++ b/netx/net/sourceforge/jnlp/util/StreamUtils.java @@ -37,9 +37,11 @@ exception statement from your version. package net.sourceforge.jnlp.util; +import java.io.BufferedReader; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; public class StreamUtils { @@ -71,4 +73,21 @@ public class StreamUtils { } } } + + + public static String readStreamAsString(InputStream stream) throws IOException { + InputStreamReader is = new InputStreamReader(stream); + StringBuilder sb = new StringBuilder(); + BufferedReader br = new BufferedReader(is); + while (true) { + String read = br.readLine(); + if (read == null) { + break; + } + sb.append(read); + + } + + return sb.toString(); + } } |