Debugging java applet in browser - works in Eclipse but not browser
Asked Answered
A

5

7

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)
Aeolus answered 18/5, 2011 at 18:8 Comment(3)
Feel free to add some code if you would like some input on why your code is not working here...Maggoty
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 browserXylophagous
Maybe you got the same problem: #17787169Pyx
H
11

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.

Histamine answered 18/5, 2011 at 18:22 Comment(2)
This doesn't seem to work for me on Java 1.7 update 51.Operant
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.Undermine
J
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.

Jose answered 18/5, 2011 at 18:16 Comment(0)
L
1

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.

Loginov answered 18/5, 2011 at 18:17 Comment(0)
M
0

Implementing a logging solution (such as Log4j) is another option that might be worth looking at. Some quick tutorials on how to get this up and running.

Maggoty answered 18/5, 2011 at 18:21 Comment(0)
A
0

when you embed your applet in html page you have to sign the applet jar file See the documentation oracle docs

create your certificate then use then in command prompt type the following command

jarsigner jarfilename.jar yourcertificatename
Accurate answered 4/5, 2013 at 22:12 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.