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

Jiri Vanek jvanek at redhat.com
Thu Apr 4 03:18:26 PDT 2013


On 04/03/2013 03:20 PM, Adam Domurad wrote:
> 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();
>  > +    }
>  >  }

Nits fixed...
>
> Looks good overall! Only really thing is I still don't have it detecting Oracle JDK =/

I do not have issues with oracle jvm :(( Today verified aon jre, jdk
> As well as we discussed, it should perhaps indicate that only javaws works with non-icedtea JVM's.

It does:) It expalins why you have never seen CPJVMNotokMessage2.
When you click ok/apply, then there is one more validation. And if there is something else then 
openjdk, then user is warned about troubles (CPJVMNotokMessage2:) )

J.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: setupaAbleJVM-itwsettings_3.diff
Type: text/x-patch
Size: 22089 bytes
Desc: not available
Url : http://mail.openjdk.java.net/pipermail/distro-pkg-dev/attachments/20130404/e9006f06/setupaAbleJVM-itwsettings_3.diff 


More information about the distro-pkg-dev mailing list