[rfc][icedtea-web] dialogue for set jre dir

Adam Domurad adomurad at redhat.com
Wed Apr 3 06:20:47 PDT 2013


On 03/29/2013 11:49 AM, Jiri Vanek wrote:
 > On 03/21/2013 04:27 PM, Adam Domurad wrote:
 >> On 03/20/2013 06:54 AM, Jiri Vanek wrote:
 >>>
 >>> ping?
 >>>
 >>> -------- Original Message --------
 >>> Subject: [rfc][icedtea-web]  dialogue for set  jre dir
 >>> Date: Fri, 22 Feb 2013 15:01:17 +0100
 >>> From: Jiri Vanek <jvanek at redhat.com>
 >>> To: IcedTea Distro List <distro-pkg-dev at openjdk.java.net>
 >>>
 >>> This is only java part of "make-jredir-configurable after install 
effort"
 >>> To jvm settings pane it adds text-field to allow to write path to 
jre, whih is then saved to
 >>> properties. There is also button which fill launch jfilechooser 
(with correct default location) to
 >>> allow to choose the jre directory
 >>> And one funny button to validate his effort (with funny colourful 
messages;). As if the user will
 >>> add wrong location, he will not even start itw-settings (later).
 >>>
 >>>
 >>> J.
 >>>
 >>>
 >>
 >> It looked quite well done. I liked the visual validation a lot. 
General comments:
 >>
 >> - We should validate as soon as the user picks a path, and we should 
not let the user accept a
 >> configuration that couldn't possibly work. (itweb-settings will not 
be able to save them from a
 >> broken jre dir, correct?)
 > Ok. Although I don like it, added (added checkbox to disable 
type-time validation)
 >> - I would like a message here stating that misconfiguration of the 
JRE will require manual editing
 >> of the properties file.
 > God idea. added. Can also cancel closing of dialogue with invalid value.
 >>
 >> - I liked the colourful checking, however note that as it stands we 
currently only support
 >> *IcedTea*,
 >
 > Not true. We support OpenJdk.

Discussed on IRC, we don't for the plugin. But at least javaws, which is 
better than I expected (I guess NetxPanel can be in the jar as long as 
it's never used?).
 >>> +
 >>> +    private String resetValidationResult(final String value, 
String result, String headerKey) {
 >>> +        return "<html>" + Translator.R(headerKey) + ": <br 
/>"+value+" <br />"+result+"<hr
 >>> /></html>";
 >>> +    }
 >>>  }
 >>
 >>
 >> The Swing code looked otherwise fine to me, although I tend to not 
like to stare at Swing code too
 >> long :-).
 >>> diff -r 125c427b7a42 
netx/net/sourceforge/jnlp/resources/Messages.properties
 >>> --- a/netx/net/sourceforge/jnlp/resources/Messages.properties  Thu 
Feb 14 15:48:21 2013 -0500
 >>> +++ b/netx/net/sourceforge/jnlp/resources/Messages.properties  Fri 
Feb 22 09:45:06 2013 +0100
 >>> @@ -301,6 +301,25 @@
 >>>  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.
 >>> +CPJVMPluginExec=Set JVM for icedtea-web
 >>
 >> The difference between 'plugin' and 'icedtea-web' setting may not be 
clear, I'd like to see 'Set JVM
 >> for icedtea-web (plugin and javaws)'
 >
 > If you are refering to CPJVMPluginExec and 
CPJVMPluginExecValidationthen you are right.
 >
 > If you are referring to CPJVMPluginArguments, then I'm afraid javaws 
do not read this. But should!
 > Worthy of another, simple patch?
 > Or add CPJVMJavawsArguments ?
 >>> +CPJVMPluginExecValidation=Validate JVM for icedtea-web
 >>> +CPJVMPluginSelectExec=Select JVM for icedtea-web
 >>> +CPJVMnone=None validation result for
 >>
 >> I'm sorry, I have no clue what 'None validation result' means or why 
it is needed. From when I saw
 >> it occur, it seems nothing be outputted would suffice.
 >
 > It is used whn there is no valid result (eg erro during processing or 
no invocation of validation)
 > kept.

I saw it occur just from switching to the JVM settings panel inside 
ITW-settings, I think.

 >>> +CPJVMvalidated=Validation result for
 >>> +CPJVMvalueNotSet=Value is not set. Hardcoded JVM will be used
 >>> +CPJVMnotLaunched=Error, process was not launched, see console 
outputs for more info
 >>
 >> s/outputs/output/
 >>> +CPJVMnoSuccess=Error, process have not ended successfully, see 
output for details, but your java
 >>> is not set correctly
 >>
 >> It's a nit, but I'd like these all to end with periods. Especially 
the messages with more than one
 >> sentence.
 >>> +CPJVMopenJdkFound=Excellent, OpenJDK detected
 >>> +CPJVMoracleFound=Great, Oracle java detected
 >>> +CPJVMibmFound=Good, IBM java detected
 >>> +CPJVMgijFound=Warning, gij detected
 >>
 >> These messages are a little too 'funny' IMHO. Anyway as stated, we 
should have exactly one correct
 >> state, 'Valid JRE, IcedTea was successfully detected'. You should 
really just have one message
 >> 'Valid JRE, {0} was successfully detected', to ease translation 
efforts. GIJ never got past java5,
 >> there's no need to do anything but fail on it (although we can say 
why).
 >
 > Not mentioned to be funny. Little bit reworded and hints leading to 
OpenJDK added.

General comments:
- I like the validate-as-you-type :-)
[nit], the validate button could be greyed out when you are on 
'auto-validate' mode
- I got the error "java.io.IOException: Cannot run program 
"/usr/java/latest/bi/bin/java"" when validating Oracle JDK. Not sure 
why. It correctly said my directory (/usr/java/latest/) had bin/java, 
but got that error while running it.

Patch comments:

 > diff -r 3405d5fc4339 netx/net/sourceforge/jnlp/config/Defaults.java
 > --- a/netx/net/sourceforge/jnlp/config/Defaults.java    Thu Mar 28 
14:40:11 2013 -0400
 > +++ b/netx/net/sourceforge/jnlp/config/Defaults.java    Fri Mar 29 
16:49:02 2013 +0100
 > @@ -391,6 +391,12 @@
 >                  DeploymentConfiguration.KEY_SECURITY_LEVEL,
 >                  new SecurityValueValidator(),
 >                  null
 > +                },
 > +                //JVM executable for itw
 > +                {
 > +                        DeploymentConfiguration.KEY_JRE_DIR,
 > +                        null,
 > +                        null
 >                  }
 >          };
 >
 > diff -r 3405d5fc4339 
netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java
 > --- a/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java 
Thu Mar 28 14:40:11 2013 -0400
 > +++ b/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java 
Fri Mar 29 16:49:02 2013 +0100
 > @@ -166,6 +166,7 @@
 >       * 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 @@
 >      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 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 @@
 >              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);
 > +        }

Looks OK

 >          if (jreFile.isFile()) {
 >              return jreFile;
 >          }
 > diff -r 3405d5fc4339 
netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java
 > --- a/netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java    Thu 
Mar 28 14:40:11 2013 -0400
 > +++ b/netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java    Fri 
Mar 29 16:49:02 2013 +0100
 > @@ -53,6 +53,7 @@
 >  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;
 > @@ -157,6 +158,20 @@
 >          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.ID.NOT_DIR
 > +                || validationResult.id == 
JvmValidationResult.ID.NOT_VALID_DIR
 > +                || validationResult.id == 
JvmValidationResult.ID.NOT_VALID_JDK) {
 > +            return JOptionPane.showConfirmDialog(ControlPanel.this,
 > + "<html>"+Translator.R("CPJVMNotokMessage1", s)+"<br>"
 > +                    + validationResult.formatedText+"<br>"
 > +                    + Translator.R("CPJVMNotokMessage2", 
DeploymentConfiguration.KEY_JRE_DIR, 
DeploymentConfiguration.USER_DEPLOYMENT_PROPERTIES_FILE)+"</html>");
 > +        }
 > +        return JOptionPane.OK_OPTION;
 > +    }
 >
 >      /**
 >       * Creates the "ok" "apply" and "cancel" buttons.
 > @@ -173,6 +188,10 @@
 >              @Override
 >              public void actionPerformed(ActionEvent e) {
 >                  ControlPanel.this.saveConfiguration();
 > +                int i = validateJdk();

[nit] 'i' could be better named

 > +                if (i!= JOptionPane.OK_OPTION){
 > +                    return;
 > +                }
 >                  ControlPanel.this.dispose();
 >              }
 >          });
 > @@ -183,6 +202,7 @@
 >              @Override
 >              public void actionPerformed(ActionEvent e) {
 >                  ControlPanel.this.saveConfiguration();
 > +                validateJdk();
 >              }
 >          });
 >          buttons.add(applyButton);
 > diff -r 3405d5fc4339 netx/net/sourceforge/jnlp/controlpanel/JVMPanel.java
 > --- a/netx/net/sourceforge/jnlp/controlpanel/JVMPanel.java Thu Mar 28 
14:40:11 2013 -0400
 > +++ b/netx/net/sourceforge/jnlp/controlpanel/JVMPanel.java Fri Mar 29 
16:49:02 2013 +0100
 > @@ -40,17 +40,44 @@
 >  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 {
 > -    private DeploymentConfiguration config;
 > +
 > +    public static class JvmValidationResult {
 > +
 > +        public static enum ID{

[nit] space here after ID
Why is this called ID ? It doesn't identify anything, it's a result.

 > +            EMPTY, NOT_DIR, NOT_VALID_DIR, NOT_VALID_JDK, VALID_JDK;
 > +        }
 > +        public final String formatedText;

s/formatedText/formattedText/

 > +        public final ID id;
 > +
 > +        public JvmValidationResult(String formatedText, ID id) {
 > +        this.id = id;
 > +        this.formatedText = formatedText;

Indent this please.

 > +        }
 > +
 > +
 > +    }
 > +
 > +   private DeploymentConfiguration config;
 > +   private File lastPath = new File("/usr/lib/jvm/java/jre/");
 >
 >      JVMPanel(DeploymentConfiguration config) {
 >          super(Translator.R("CPHeadJVMSettings"), new GridBagLayout());
 > @@ -59,22 +86,130 @@
 >      }
 >
 >      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>");
 > +        final JTextField 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() {
 > +            String last = "";
 > +            int c = 0;

Am I missing something ? Where are last & c used ?

 > +
 > +            private String documentToString(Document d) {
 > +                try {
 > +                    return d.getText(0, d.getLength());
 > +                } catch (Exception ex) {
 > +                    return "";
 > +                }
 > +            }
 > +
 > +            @Override
 > +            public void insertUpdate(DocumentEvent e) {
 > +                if (allowTypoTimeValidation.isSelected()) {
 > +                    JvmValidationResult s = 
validateJvm(testFieldArgumentsExec.getText());
 > + 
validationResult.setText(resetValidationResult(testFieldArgumentsExec.getText(), 
s.formatedText, "CPJVMvalidated"));
 > +                }
 > +            }
 > +
 > +            @Override
 > +            public void removeUpdate(DocumentEvent e) {
 > +                if (allowTypoTimeValidation.isSelected()) {
 > +                    JvmValidationResult s = 
validateJvm(testFieldArgumentsExec.getText());
 > + 
validationResult.setText(resetValidationResult(testFieldArgumentsExec.getText(), 
s.formatedText, "CPJVMvalidated"));
 > +                }
 > +            }
 > +
 > +            @Override
 > +            public void changedUpdate(DocumentEvent e) {
 > +                if (allowTypoTimeValidation.isSelected()) {
 > +                    JvmValidationResult s = 
validateJvm(testFieldArgumentsExec.getText());
 > + 
validationResult.setText(resetValidationResult(testFieldArgumentsExec.getText(), 
s.formatedText, "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.formatedText, "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 +217,104 @@
 >          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.ID.EMPTY);
 > +        }
 > +        String validationResult = "";
 > +        File jreDirFile = new File(cmd);
 > +        JvmValidationResult.ID latestOne = JvmValidationResult.ID.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.ID.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.ID.NOT_DIR) {
 > +                latestOne = JvmValidationResult.ID.NOT_VALID_JDK;
 > +            }
 > +        }
 > +        File rtFile = new File(cmd + File.separator + "lib" + 
File.separator + "rt.jar");
 > +        if (javaFile.isFile()) {
 > +            validationResult += "<span color=\"green\">" + 
Translator.R("CPJVMrtJar") + "</span><br />";
 > +        } else {
 > +            validationResult += "<span color=\"red\">" + 
Translator.R("CPJVMnoRtJar") + "</span><br />";
 > +            if (latestOne != JvmValidationResult.ID.NOT_DIR) {
 > +                latestOne = JvmValidationResult.ID.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.ID.NOT_DIR) {
 > +                latestOne = JvmValidationResult.ID.NOT_VALID_JDK;
 > +            }
 > +            return new JvmValidationResult(validationResult, latestOne);
 > +        }
 > +        if (r.intValue() != 0) {
 > +            validationResult += "<span color=\"red\">" + 
Translator.R("CPJVMnoSuccess") + "</span>";
 > +            if (latestOne != JvmValidationResult.ID.NOT_DIR) {
 > +                latestOne = JvmValidationResult.ID.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.ID.VALID_JDK);
 > +        }
 > +        if (processErrorStream.contains("ibm") || 
processStdOutStream.contains("ibm")) {
 > +            validationResult += "<span color=\"green\">" + 
Translator.R("CPJVMibmFound") + "</span>";
 > +            if (latestOne != JvmValidationResult.ID.NOT_DIR) {
 > +                latestOne = JvmValidationResult.ID.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.ID.NOT_DIR) {
 > +                latestOne = JvmValidationResult.ID.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.ID.NOT_DIR) {
 > +                latestOne = JvmValidationResult.ID.NOT_VALID_JDK;
 > +            }
 > +            return new JvmValidationResult(validationResult, latestOne);
 > +        }
 > +        validationResult += "<span color=\"orange\">" + 
Translator.R("CPJVMstrangeProcess") + "</span>";
 > +        return new JvmValidationResult(validationResult, 
JvmValidationResult.ID.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 -r 3405d5fc4339 
netx/net/sourceforge/jnlp/resources/Messages.properties
 > --- a/netx/net/sourceforge/jnlp/resources/Messages.properties    Thu 
Mar 28 14:40:11 2013 -0400
 > +++ b/netx/net/sourceforge/jnlp/resources/Messages.properties    Fri 
Mar 29 16:49:02 2013 +0100
 > @@ -310,6 +310,29 @@
 >  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=None validation result for

s/None/No/

 > +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=With invalid JDK IcedTea-Web will probably not 
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.

Looks OK, although I haven't see this 'CPJVMNotokMessage2'.

 > +
 >
 >  # Control Panel - Buttons
 >  CPButAbout=About...
 > diff -r 3405d5fc4339 netx/net/sourceforge/jnlp/util/StreamUtils.java
 > --- a/netx/net/sourceforge/jnlp/util/StreamUtils.java    Thu Mar 28 
14:40:11 2013 -0400
 > +++ b/netx/net/sourceforge/jnlp/util/StreamUtils.java    Fri Mar 29 
16:49:02 2013 +0100
 > @@ -37,9 +37,11 @@
 >
 >  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 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();
 > +    }
 >  }

Looks good overall! Only really thing is I still don't have it detecting 
Oracle JDK =/
As well as we discussed, it should perhaps indicate that only javaws 
works with non-icedtea JVM's.

-Adam




More information about the distro-pkg-dev mailing list