Debugging java applet in browser - works in Eclipse but not browser

14,339

Solution 1

Just a side note. It's rather easy to remote debug applets.

Configure the Java plugin to allow remote debugging. You do it in different ways in different platforms, but it will be something like this on windows. Start the control panel, select java. Click around till you find VM options, and add these VM arguments:

-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,address=6789,suspend=n

6789 will be the debug port.

Starting the remote debugging in Eclipse is done by doing something similar to. Debug configurations, Remote Java Application, Create a new configuration. Select Standard (Socket Attach) as connection type, and enter locahost as address and 6789 as port.

Solution 2

Consider enabling the Java Console which will allow you to see all the exception stack traces hopefully making it easier for you to debug.

Also "appletviewer" is designed for testing applets outside a browser including allowing you to see the exceptions.

Solution 3

It's very likely that your SecurityManager isn't allowing it.

In FireFox, you can check the java console by going to Tools > Java Console. Firefox should already have it set up.

Share:
14,339
Still don't know everything
Author by

Still don't know everything

Updated on June 04, 2022

Comments

  • Still don't know everything
    Still don't know everything about 2 years

    I have created an applet that opens a JFileChooser to select a file on the click of a JButton. It works fine when I run it in Eclipse. When I embed it in an HTML page with the applet tag nothing happens when I click the button.

    Any suggestions as to why the JFileChooser does not open in the browser would be appreciated, but my main question is how would I debug this? I haven't been able to find anything on Google about how to add a Java console to Firefox 3.6 or Chrome. Is there a way to get some kind of information as to why the JFileChooser does not open?

    Debugging answered in comment below

    So the console says there is an access denied exception, which I'm guessing is because I have not "signed" the applet. What should the development process be as far as signing an applet goes? Do I have to sign it with a certificate issued by a valid CA before I can test it in a browser, or is there some simple thing you can do while just testing?

    Here is my code:

    package com.putapplet;
    
    import java.awt.FlowLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.InputStreamReader;
    import java.net.URL;
    
    import javax.swing.JApplet;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JProgressBar;
    import javax.swing.SwingUtilities;
    
    
    @SuppressWarnings("serial")
    public class PutToS3Applet extends JApplet {
    
        private static long maxFileSizeInBytes = 1048576;
    
        private static String listenerUrl = "xxx";
        private String listenerQueryString;
    
        private String signedPutUrl;
    
        private JProgressBar progressBar;
        private JButton button;
        private JLabel messageField;
    
        public void init() {
    
            setMaxFilesize(1);
    
            try {
                SwingUtilities.invokeAndWait(new Runnable() {
                    public void run() {                    
                        createGUI();
                    }
                });
            } catch (Exception e) {
                System.err.println("createGUI didn't complete successfully");
            }       
        }
    
        private void createGUI() {
    
            button = new JButton("Choose File...");
            button.addActionListener(new ButtonListener()); 
    
            progressBar = new JProgressBar(0, 100);
            progressBar.setStringPainted(true);
    
            messageField = new JLabel();
            //messageField.setPreferredSize(new Dimension(300, 20));
    
            FlowLayout layout = new FlowLayout();
            layout.setAlignment(FlowLayout.LEFT);
    
            JPanel topPanel = new JPanel();
            topPanel.setLayout(layout);
    
            JPanel bottomPanel = new JPanel();
            bottomPanel.setLayout(layout);
    
            topPanel.add(button);
            topPanel.add(progressBar);
            bottomPanel.add(messageField);
    
            setLayout(new GridLayout(2,1));
            add(topPanel);
            add(bottomPanel);
    
        }
    
        class ButtonListener implements ActionListener {
            public void actionPerformed(ActionEvent ae) {
                JFileChooser fileChooser = new JFileChooser();
                int showOpenDialog = fileChooser.showDialog(null, "Upload File");
                if (showOpenDialog != JFileChooser.APPROVE_OPTION) return;
    
                final File fileToUpload = fileChooser.getSelectedFile();
    
                if (fileToUpload.length() > PutToS3Applet.maxFileSizeInBytes) {
                    messageField.setText("Your file must be smaller than " + getHumanReadableMaxFilesize());
                    return;
                }
    
                listenerQueryString = "query[filename]=" + fileToUpload.getName();
    
                //get signed PUT url for s3
                try {
    
                    URL listener = new URL(listenerUrl + listenerQueryString);
                    BufferedReader in = new BufferedReader(new InputStreamReader(listener.openStream()));
                    signedPutUrl = in.readLine().replace("http://", "https://");
                    messageField.setText(signedPutUrl);
    
                } catch (Exception e) {             
                    messageField.setText("Oops, there was a problem connecting to the server. Please try again.");
                    e.printStackTrace();
                }
            }
        }
    
        private String getHumanReadableMaxFilesize() {
            return Long.toString((PutToS3Applet.maxFileSizeInBytes / 1024 / 1024)) + "MB";
        }
    
        private void setMaxFilesize(int sizeInMegaBytes) {
            PutToS3Applet.maxFileSizeInBytes = PutToS3Applet.maxFileSizeInBytes * sizeInMegaBytes;
        }
    }
    

    Here is the exception:

    Exception in thread "AWT-EventQueue-1" java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
    at java.security.AccessController.checkPermission(AccessController.java:546)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285)
    at java.lang.System.getProperty(System.java:650)
    at javax.swing.filechooser.FileSystemView.getHomeDirectory(FileSystemView.java:393)
    at javax.swing.plaf.metal.MetalFileChooserUI.installComponents(MetalFileChooserUI.java:253)
    at javax.swing.plaf.basic.BasicFileChooserUI.installUI(BasicFileChooserUI.java:136)
    at javax.swing.plaf.metal.MetalFileChooserUI.installUI(MetalFileChooserUI.java:126)
    at javax.swing.JComponent.setUI(JComponent.java:662)
    at javax.swing.JFileChooser.updateUI(JFileChooser.java:1763)
    at javax.swing.JFileChooser.setup(JFileChooser.java:360)
    at javax.swing.JFileChooser.<init>(JFileChooser.java:333)
    at javax.swing.JFileChooser.<init>(JFileChooser.java:286)
    at com.putapplet.PutToS3Applet$ButtonListener.actionPerformed(PutToS3Applet.java:82)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6289)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:6054)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4652)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4482)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Component.dispatchEvent(Component.java:4482)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644)
    at java.awt.EventQueue.access$000(EventQueue.java:85)
    at java.awt.EventQueue$1.run(EventQueue.java:603)
    at java.awt.EventQueue$1.run(EventQueue.java:601)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
    at java.awt.EventQueue$2.run(EventQueue.java:617)
    at java.awt.EventQueue$2.run(EventQueue.java:615)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:614)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
    
    • Kyle
      Kyle about 13 years
      Feel free to add some code if you would like some input on why your code is not working here...
    • Still don't know everything
      Still don't know everything about 13 years
      I found the answer to how to debug, at least on Ubuntu: Run the command jcontrol. On the Advanced tab expand Java console and select Show console. This will cause the Java console to open up whenever an applet runs in your browser
    • Oli
      Oli almost 11 years
      Maybe you got the same problem: stackoverflow.com/questions/17786669/…
  • mjaggard
    mjaggard over 10 years
    This doesn't seem to work for me on Java 1.7 update 51.
  • Udo Borkowski
    Udo Borkowski almost 8 years
    To configure the Java plugin to allow remote debugging on Mac OSX (e.g. for Safari): System Preferences > Java (the "Java Control Panel” opens). “Java” tab > View… (the “Java Runtime Environment Settings” window opens). In the table find the proper line, click into the “Runtime Parameters” field and add the VM arguments given above.