src/java.desktop/share/classes/sun/applet/AppletViewer.java
branchJDK-8145252-TLS13-branch
changeset 56755 9e1b125a3f75
parent 56754 d0728b0f98f9
parent 50542 b6ff4cd463e3
child 56757 01f1611dba52
--- a/src/java.desktop/share/classes/sun/applet/AppletViewer.java	Wed Jun 13 09:57:59 2018 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1312 +0,0 @@
-/*
- * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.applet;
-
-import java.util.*;
-import java.io.*;
-import java.awt.*;
-import java.awt.event.*;
-import java.awt.print.*;
-import javax.print.attribute.*;
-import java.applet.*;
-import java.net.URL;
-import java.net.SocketPermission;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import sun.awt.SunToolkit;
-import sun.awt.AppContext;
-
-/**
- * A frame to show the applet tag in.
- */
-@SuppressWarnings("serial") // JDK-implementation class
-@Deprecated(since = "9")
-final class TextFrame extends Frame {
-
-    /**
-     * Create the tag frame.
-     */
-    @SuppressWarnings("deprecation")
-    TextFrame(int x, int y, String title, String text) {
-        setTitle(title);
-        TextArea txt = new TextArea(20, 60);
-        txt.setText(text);
-        txt.setEditable(false);
-
-        add("Center", txt);
-
-        Panel p = new Panel();
-        add("South", p);
-        Button b = new Button(amh.getMessage("button.dismiss", "Dismiss"));
-        p.add(b);
-
-        class ActionEventListener implements ActionListener {
-            @Override
-            public void actionPerformed(ActionEvent evt) {
-                dispose();
-            }
-        }
-        b.addActionListener(new ActionEventListener());
-
-        pack();
-        move(x, y);
-        setVisible(true);
-
-        WindowListener windowEventListener = new WindowAdapter() {
-
-            @Override
-            public void windowClosing(WindowEvent evt) {
-                dispose();
-            }
-        };
-
-        addWindowListener(windowEventListener);
-    }
-    private static AppletMessageHandler amh = new AppletMessageHandler("textframe");
-
-}
-
-/**
- * Lets us construct one using unix-style one shot behaviors.
- */
-@Deprecated(since = "9")
-final class StdAppletViewerFactory implements AppletViewerFactory {
-
-    @Override
-    public AppletViewer createAppletViewer(int x, int y,
-                                           URL doc, Hashtable<String, String> atts) {
-        return new AppletViewer(x, y, doc, atts, System.out, this);
-    }
-
-    @Override
-    public MenuBar getBaseMenuBar() {
-        return new MenuBar();
-    }
-
-    @Override
-    public boolean isStandalone() {
-        return true;
-    }
-}
-
-/**
- * The applet viewer makes it possible to run a Java applet without using a browser.
- * For details on the syntax that <B>appletviewer</B> supports, see
- * <a href="../../../docs/tooldocs/appletviewertags.html">AppletViewer Tags</a>.
- * (The document named appletviewertags.html in the JDK's docs/tooldocs directory,
- *  once the JDK docs have been installed.)
- *
- * @deprecated The Applet API is deprecated. See the
- * <a href="../../java/applet/package-summary.html"> java.applet package
- * documentation</a> for further information.
- */
-@SuppressWarnings({"serial"}) // JDK-implementation class
-@Deprecated(since = "9")
-public class AppletViewer extends Frame implements AppletContext, Printable {
-
-    /**
-     * Some constants...
-     */
-    private static String defaultSaveFile = "Applet.ser";
-
-    /**
-     * The panel in which the applet is being displayed.
-     */
-    AppletViewerPanel panel;
-
-    /**
-     * The status line.
-     */
-    Label label;
-
-    /**
-     * output status messages to this stream
-     */
-
-    PrintStream statusMsgStream;
-
-    /**
-     * For cloning
-     */
-    AppletViewerFactory factory;
-
-    @Deprecated(since = "9")
-    private final class UserActionListener implements ActionListener {
-        @Override
-        public void actionPerformed(ActionEvent evt) {
-            processUserAction(evt);
-        }
-    }
-
-    /**
-     * Create the applet viewer.
-     */
-    public AppletViewer(int x, int y, URL doc, Hashtable<String, String> atts,
-                        PrintStream statusMsgStream, AppletViewerFactory factory) {
-        this.factory = factory;
-        this.statusMsgStream = statusMsgStream;
-        setTitle(amh.getMessage("tool.title", atts.get("code")));
-
-        MenuBar mb = factory.getBaseMenuBar();
-
-        Menu m = new Menu(amh.getMessage("menu.applet"));
-
-        addMenuItem(m, "menuitem.restart");
-        addMenuItem(m, "menuitem.reload");
-        addMenuItem(m, "menuitem.stop");
-        addMenuItem(m, "menuitem.save");
-        addMenuItem(m, "menuitem.start");
-        addMenuItem(m, "menuitem.clone");
-        m.add(new MenuItem("-"));
-        addMenuItem(m, "menuitem.tag");
-        addMenuItem(m, "menuitem.info");
-        addMenuItem(m, "menuitem.edit").disable();
-        addMenuItem(m, "menuitem.encoding");
-        m.add(new MenuItem("-"));
-        addMenuItem(m, "menuitem.print");
-        m.add(new MenuItem("-"));
-        addMenuItem(m, "menuitem.props");
-        m.add(new MenuItem("-"));
-        addMenuItem(m, "menuitem.close");
-        if (factory.isStandalone()) {
-            addMenuItem(m, "menuitem.quit");
-        }
-
-        mb.add(m);
-
-        setMenuBar(mb);
-
-        add("Center", panel = new AppletViewerPanel(doc, atts));
-        add("South", label = new Label(amh.getMessage("label.hello")));
-        panel.init();
-        appletPanels.addElement(panel);
-
-        pack();
-        move(x, y);
-        setVisible(true);
-
-        WindowListener windowEventListener = new WindowAdapter() {
-
-            @Override
-            public void windowClosing(WindowEvent evt) {
-                appletClose();
-            }
-
-            @Override
-            public void windowIconified(WindowEvent evt) {
-                appletStop();
-            }
-
-            @Override
-            public void windowDeiconified(WindowEvent evt) {
-                appletStart();
-            }
-        };
-
-        @Deprecated(since = "9")
-        class AppletEventListener implements AppletListener
-        {
-            final Frame frame;
-
-            public AppletEventListener(Frame frame)
-            {
-                this.frame = frame;
-            }
-
-            @Override
-            @SuppressWarnings("deprecation")
-            public void appletStateChanged(AppletEvent evt)
-            {
-                AppletPanel src = (AppletPanel)evt.getSource();
-
-                switch (evt.getID()) {
-                    case AppletPanel.APPLET_RESIZE: {
-                        if(src != null) {
-                            resize(preferredSize());
-                            validate();
-                        }
-                        break;
-                    }
-                    case AppletPanel.APPLET_LOADING_COMPLETED: {
-                        Applet a = src.getApplet(); // sun.applet.AppletPanel
-
-                        // Fixed #4754451: Applet can have methods running on main
-                        // thread event queue.
-                        //
-                        // The cause of this bug is that the frame of the applet
-                        // is created in main thread group. Thus, when certain
-                        // AWT/Swing events are generated, the events will be
-                        // dispatched through the wrong event dispatch thread.
-                        //
-                        // To fix this, we rearrange the AppContext with the frame,
-                        // so the proper event queue will be looked up.
-                        //
-                        // Swing also maintains a Frame list for the AppContext,
-                        // so we will have to rearrange it as well.
-                        //
-                        if (a != null)
-                            AppletPanel.changeFrameAppContext(frame, SunToolkit.targetToAppContext(a));
-                        else
-                            AppletPanel.changeFrameAppContext(frame, AppContext.getAppContext());
-
-                        break;
-                    }
-                }
-            }
-        };
-
-        addWindowListener(windowEventListener);
-        panel.addAppletListener(new AppletEventListener(this));
-
-        // Start the applet
-        showStatus(amh.getMessage("status.start"));
-        initEventQueue();
-    }
-
-    // XXX 99/9/10 probably should be "private"
-    public MenuItem addMenuItem(Menu m, String s) {
-        MenuItem mItem = new MenuItem(amh.getMessage(s));
-        mItem.addActionListener(new UserActionListener());
-        return m.add(mItem);
-    }
-
-    /**
-     * Send the initial set of events to the appletviewer event queue.
-     * On start-up the current behaviour is to load the applet and call
-     * Applet.init() and Applet.start().
-     */
-    private void initEventQueue() {
-        // appletviewer.send.event is an undocumented and unsupported system
-        // property which is used exclusively for testing purposes.
-        String eventList = System.getProperty("appletviewer.send.event");
-
-        if (eventList == null) {
-            // Add the standard events onto the event queue.
-            panel.sendEvent(AppletPanel.APPLET_LOAD);
-            panel.sendEvent(AppletPanel.APPLET_INIT);
-            panel.sendEvent(AppletPanel.APPLET_START);
-        } else {
-            // We're testing AppletViewer.  Force the specified set of events
-            // onto the event queue, wait for the events to be processed, and
-            // exit.
-
-            // The list of events that will be executed is provided as a
-            // ","-separated list.  No error-checking will be done on the list.
-            String [] events = splitSeparator(",", eventList);
-
-            for (int i = 0; i < events.length; i++) {
-                System.out.println("Adding event to queue: " + events[i]);
-                if (events[i].equals("dispose"))
-                    panel.sendEvent(AppletPanel.APPLET_DISPOSE);
-                else if (events[i].equals("load"))
-                    panel.sendEvent(AppletPanel.APPLET_LOAD);
-                else if (events[i].equals("init"))
-                    panel.sendEvent(AppletPanel.APPLET_INIT);
-                else if (events[i].equals("start"))
-                    panel.sendEvent(AppletPanel.APPLET_START);
-                else if (events[i].equals("stop"))
-                    panel.sendEvent(AppletPanel.APPLET_STOP);
-                else if (events[i].equals("destroy"))
-                    panel.sendEvent(AppletPanel.APPLET_DESTROY);
-                else if (events[i].equals("quit"))
-                    panel.sendEvent(AppletPanel.APPLET_QUIT);
-                else if (events[i].equals("error"))
-                    panel.sendEvent(AppletPanel.APPLET_ERROR);
-                else
-                    // non-fatal error if we get an unrecognized event
-                    System.out.println("Unrecognized event name: " + events[i]);
-            }
-
-            while (!panel.emptyEventQueue()) ;
-            appletSystemExit();
-        }
-    }
-
-    /**
-     * Split a string based on the presence of a specified separator.  Returns
-     * an array of arbitrary length.  The end of each element in the array is
-     * indicated by the separator of the end of the string.  If there is a
-     * separator immediately before the end of the string, the final element
-     * will be empty.  None of the strings will contain the separator.  Useful
-     * when separating strings such as "foo/bar/bas" using separator "/".
-     *
-     * @param sep  The separator.
-     * @param s    The string to split.
-     * @return     An array of strings.  Each string in the array is determined
-     *             by the location of the provided sep in the original string,
-     *             s.  Whitespace not stripped.
-     */
-    private String [] splitSeparator(String sep, String s) {
-        Vector<String> v = new Vector<>();
-        int tokenStart = 0;
-        int tokenEnd   = 0;
-
-        while ((tokenEnd = s.indexOf(sep, tokenStart)) != -1) {
-            v.addElement(s.substring(tokenStart, tokenEnd));
-            tokenStart = tokenEnd+1;
-        }
-        // Add the final element.
-        v.addElement(s.substring(tokenStart));
-
-        String [] retVal = new String[v.size()];
-        v.copyInto(retVal);
-        return retVal;
-    }
-
-    /*
-     * Methods for java.applet.AppletContext
-     */
-
-    private static Map<URL, AudioClip> audioClips = new HashMap<>();
-
-    /**
-     * Get an audio clip.
-     */
-    @Override
-    public AudioClip getAudioClip(URL url) {
-        checkConnect(url);
-        synchronized (audioClips) {
-            AudioClip clip = audioClips.get(url);
-            if (clip == null) {
-                audioClips.put(url, clip = new AppletAudioClip(url));
-            }
-            return clip;
-        }
-    }
-
-    private static Map<URL, AppletImageRef> imageRefs = new HashMap<>();
-
-    /**
-     * Get an image.
-     */
-    @Override
-    public Image getImage(URL url) {
-        return getCachedImage(url);
-    }
-
-    /**
-     * Get an image.
-     */
-    static Image getCachedImage(URL url) {
-        // System.getSecurityManager().checkConnection(url.getHost(), url.getPort());
-        synchronized (imageRefs) {
-            AppletImageRef ref = imageRefs.get(url);
-            if (ref == null) {
-                ref = new AppletImageRef(url);
-                imageRefs.put(url, ref);
-            }
-            return ref.get();
-        }
-    }
-
-    /**
-     * Flush the image cache.
-     */
-    static void flushImageCache() {
-        imageRefs.clear();
-    }
-
-    static Vector<AppletPanel> appletPanels = new Vector<>();
-
-    /**
-     * Get an applet by name.
-     */
-    @Override
-    public Applet getApplet(String name) {
-        AppletSecurity security = (AppletSecurity)System.getSecurityManager();
-        name = name.toLowerCase();
-        SocketPermission panelSp =
-            new SocketPermission(panel.getCodeBase().getHost(), "connect");
-        for (Enumeration<AppletPanel> e = appletPanels.elements() ; e.hasMoreElements() ;) {
-            AppletPanel p = e.nextElement();
-            String param = p.getParameter("name");
-            if (param != null) {
-                param = param.toLowerCase();
-            }
-            if (name.equals(param) &&
-                p.getDocumentBase().equals(panel.getDocumentBase())) {
-
-                SocketPermission sp =
-                    new SocketPermission(p.getCodeBase().getHost(), "connect");
-
-                if (panelSp.implies(sp)) {
-                    return p.applet;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Return an enumeration of all the accessible
-     * applets on this page.
-     */
-    @Override
-    public Enumeration<Applet> getApplets() {
-        AppletSecurity security = (AppletSecurity)System.getSecurityManager();
-        Vector<Applet> v = new Vector<>();
-        SocketPermission panelSp =
-            new SocketPermission(panel.getCodeBase().getHost(), "connect");
-
-        for (Enumeration<AppletPanel> e = appletPanels.elements() ; e.hasMoreElements() ;) {
-            AppletPanel p = e.nextElement();
-            if (p.getDocumentBase().equals(panel.getDocumentBase())) {
-
-                SocketPermission sp =
-                    new SocketPermission(p.getCodeBase().getHost(), "connect");
-                if (panelSp.implies(sp)) {
-                    v.addElement(p.applet);
-                }
-            }
-        }
-        return v.elements();
-    }
-
-    /**
-     * Ignore.
-     */
-    @Override
-    public void showDocument(URL url) {
-    }
-
-    /**
-     * Ignore.
-     */
-    @Override
-    public void showDocument(URL url, String target) {
-    }
-
-    /**
-     * Show status.
-     */
-    @Override
-    public void showStatus(String status) {
-        label.setText(status);
-    }
-
-    @Override
-    public void setStream(String key, InputStream stream)throws IOException{
-        // We do nothing.
-    }
-
-    @Override
-    public InputStream getStream(String key){
-        // We do nothing.
-        return null;
-    }
-
-    @Override
-    public Iterator<String> getStreamKeys(){
-        // We do nothing.
-        return null;
-    }
-
-    /**
-     * System parameters.
-     */
-    static Hashtable<String, String> systemParam = new Hashtable<>();
-
-    static {
-        systemParam.put("codebase", "codebase");
-        systemParam.put("code", "code");
-        systemParam.put("alt", "alt");
-        systemParam.put("width", "width");
-        systemParam.put("height", "height");
-        systemParam.put("align", "align");
-        systemParam.put("vspace", "vspace");
-        systemParam.put("hspace", "hspace");
-    }
-
-    /**
-     * Print the HTML tag.
-     */
-    public static void printTag(PrintStream out, Hashtable<String, String> atts) {
-        out.print("<applet");
-
-        String v = atts.get("codebase");
-        if (v != null) {
-            out.print(" codebase=\"" + v + "\"");
-        }
-
-        v = atts.get("code");
-        if (v == null) {
-            v = "applet.class";
-        }
-        out.print(" code=\"" + v + "\"");
-        v = atts.get("width");
-        if (v == null) {
-            v = "150";
-        }
-        out.print(" width=" + v);
-
-        v = atts.get("height");
-        if (v == null) {
-            v = "100";
-        }
-        out.print(" height=" + v);
-
-        v = atts.get("name");
-        if (v != null) {
-            out.print(" name=\"" + v + "\"");
-        }
-        out.println(">");
-
-        // A very slow sorting algorithm
-        int len = atts.size();
-        String params[] = new String[len];
-        len = 0;
-        for (Enumeration<String> e = atts.keys() ; e.hasMoreElements() ;) {
-            String param = e.nextElement();
-            int i = 0;
-            for (; i < len ; i++) {
-                if (params[i].compareTo(param) >= 0) {
-                    break;
-                }
-            }
-            System.arraycopy(params, i, params, i + 1, len - i);
-            params[i] = param;
-            len++;
-        }
-
-        for (int i = 0 ; i < len ; i++) {
-            String param = params[i];
-            if (systemParam.get(param) == null) {
-                out.println("<param name=" + param +
-                            " value=\"" + atts.get(param) + "\">");
-            }
-        }
-        out.println("</applet>");
-    }
-
-    /**
-     * Make sure the atrributes are uptodate.
-     */
-    @SuppressWarnings("deprecation")
-    public void updateAtts() {
-        Dimension d = panel.size();
-        Insets in = panel.insets();
-        panel.atts.put("width",
-                       Integer.toString(d.width - (in.left + in.right)));
-        panel.atts.put("height",
-                       Integer.toString(d.height - (in.top + in.bottom)));
-    }
-
-    /**
-     * Restart the applet.
-     */
-    void appletRestart() {
-        panel.sendEvent(AppletPanel.APPLET_STOP);
-        panel.sendEvent(AppletPanel.APPLET_DESTROY);
-        panel.sendEvent(AppletPanel.APPLET_INIT);
-        panel.sendEvent(AppletPanel.APPLET_START);
-    }
-
-    /**
-     * Reload the applet.
-     */
-    void appletReload() {
-        panel.sendEvent(AppletPanel.APPLET_STOP);
-        panel.sendEvent(AppletPanel.APPLET_DESTROY);
-        panel.sendEvent(AppletPanel.APPLET_DISPOSE);
-
-        /**
-         * Fixed #4501142: Classloader sharing policy doesn't
-         * take "archive" into account. This will be overridden
-         * by Java Plug-in.                     [stanleyh]
-         */
-        AppletPanel.flushClassLoader(panel.getClassLoaderCacheKey());
-
-        /*
-         * Make sure we don't have two threads running through the event queue
-         * at the same time.
-         */
-        try {
-            panel.joinAppletThread();
-            panel.release();
-        } catch (InterruptedException e) {
-            return;   // abort the reload
-        }
-
-        panel.createAppletThread();
-        panel.sendEvent(AppletPanel.APPLET_LOAD);
-        panel.sendEvent(AppletPanel.APPLET_INIT);
-        panel.sendEvent(AppletPanel.APPLET_START);
-    }
-
-    /**
-     * Save the applet to a well known file (for now) as a serialized object
-     */
-    @SuppressWarnings("deprecation")
-    void appletSave() {
-        AccessController.doPrivileged(new PrivilegedAction<Object>() {
-
-            @Override
-            public Object run() {
-                // XXX: this privileged block should be made smaller
-                // by initializing a private static variable with "user.dir"
-
-                // Applet needs to be stopped for serialization to succeed.
-                // Since panel.sendEvent only queues the event, there is a
-                // chance that the event will not be processed before
-                // serialization begins.  However, by sending the event before
-                // FileDialog is created, enough time is given such that this
-                // situation is unlikely to ever occur.
-
-                panel.sendEvent(AppletPanel.APPLET_STOP);
-                FileDialog fd = new FileDialog(AppletViewer.this,
-                                               amh.getMessage("appletsave.filedialogtitle"),
-                                               FileDialog.SAVE);
-                // needed for a bug under Solaris...
-                fd.setDirectory(System.getProperty("user.dir"));
-                fd.setFile(defaultSaveFile);
-                fd.show();
-                String fname = fd.getFile();
-                if (fname == null) {
-                    // Restart applet if Save is cancelled.
-                    panel.sendEvent(AppletPanel.APPLET_START);
-                    return null;                // cancelled
-                }
-                String dname = fd.getDirectory();
-                File file = new File(dname, fname);
-
-                try (FileOutputStream fos = new FileOutputStream(file);
-                     BufferedOutputStream bos = new BufferedOutputStream(fos);
-                     ObjectOutputStream os = new ObjectOutputStream(bos)) {
-
-                    showStatus(amh.getMessage("appletsave.err1", panel.applet.toString(), file.toString()));
-                    os.writeObject(panel.applet);
-                } catch (IOException ex) {
-                    System.err.println(amh.getMessage("appletsave.err2", ex));
-                } finally {
-                    panel.sendEvent(AppletPanel.APPLET_START);
-                }
-                return null;
-            }
-        });
-    }
-
-    /**
-     * Clone the viewer and the applet.
-     */
-    @SuppressWarnings("deprecation")
-    void appletClone() {
-        Point p = location();
-        updateAtts();
-        @SuppressWarnings("unchecked")
-        Hashtable<String, String> tmp = (Hashtable<String, String>) panel.atts.clone();
-        factory.createAppletViewer(p.x + XDELTA, p.y + YDELTA,
-                                   panel.documentURL, tmp);
-    }
-
-    /**
-     * Show the applet tag.
-     */
-    @SuppressWarnings("deprecation")
-    void appletTag() {
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        updateAtts();
-        printTag(new PrintStream(out), panel.atts);
-        showStatus(amh.getMessage("applettag"));
-
-        Point p = location();
-        new TextFrame(p.x + XDELTA, p.y + YDELTA, amh.getMessage("applettag.textframe"), out.toString());
-    }
-
-    /**
-     * Show the applet info.
-     */
-    @SuppressWarnings("deprecation")
-    void appletInfo() {
-        String str = panel.applet.getAppletInfo();
-        if (str == null) {
-            str = amh.getMessage("appletinfo.applet");
-        }
-        str += "\n\n";
-
-        String atts[][] = panel.applet.getParameterInfo();
-        if (atts != null) {
-            for (int i = 0 ; i < atts.length ; i++) {
-                str += atts[i][0] + " -- " + atts[i][1] + " -- " + atts[i][2] + "\n";
-            }
-        } else {
-            str += amh.getMessage("appletinfo.param");
-        }
-
-        Point p = location();
-        new TextFrame(p.x + XDELTA, p.y + YDELTA, amh.getMessage("appletinfo.textframe"), str);
-
-    }
-
-    /**
-     * Show character encoding type
-     */
-    void appletCharacterEncoding() {
-        showStatus(amh.getMessage("appletencoding", encoding));
-    }
-
-    /**
-     * Edit the applet.
-     */
-    void appletEdit() {
-    }
-
-    /**
-     * Print the applet.
-     */
-    void appletPrint() {
-        PrinterJob pj = PrinterJob.getPrinterJob();
-
-        if (pj != null) {
-            PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
-            if (pj.printDialog(aset)) {
-                pj.setPrintable(this);
-                try {
-                    pj.print(aset);
-                    statusMsgStream.println(amh.getMessage("appletprint.finish"));
-                } catch (PrinterException e) {
-                   statusMsgStream.println(amh.getMessage("appletprint.fail"));
-                }
-            } else {
-                statusMsgStream.println(amh.getMessage("appletprint.cancel"));
-            }
-        } else {
-            statusMsgStream.println(amh.getMessage("appletprint.fail"));
-        }
-    }
-
-    @Override
-    public int print(Graphics graphics, PageFormat pf, int pageIndex) {
-        if (pageIndex > 0) {
-            return Printable.NO_SUCH_PAGE;
-        } else {
-            Graphics2D g2d = (Graphics2D)graphics;
-            g2d.translate(pf.getImageableX(), pf.getImageableY());
-            panel.applet.printAll(graphics);
-            return Printable.PAGE_EXISTS;
-        }
-    }
-
-    /**
-     * Properties.
-     */
-    static AppletProps props;
-    public static synchronized void networkProperties() {
-        if (props == null) {
-            props = new AppletProps();
-        }
-        props.addNotify();
-        props.setVisible(true);
-    }
-
-    /**
-     * Start the applet.
-     */
-    void appletStart() {
-        panel.sendEvent(AppletPanel.APPLET_START);
-    }
-
-    /**
-     * Stop the applet.
-     */
-    void appletStop() {
-        panel.sendEvent(AppletPanel.APPLET_STOP);
-    }
-
-    /**
-     * Shutdown a viewer.
-     * Stop, Destroy, Dispose and Quit a viewer
-     */
-    private void appletShutdown(AppletPanel p) {
-        p.sendEvent(AppletPanel.APPLET_STOP);
-        p.sendEvent(AppletPanel.APPLET_DESTROY);
-        p.sendEvent(AppletPanel.APPLET_DISPOSE);
-        p.sendEvent(AppletPanel.APPLET_QUIT);
-    }
-
-    /**
-     * Close this viewer.
-     * Stop, Destroy, Dispose and Quit an AppletView, then
-     * reclaim resources and exit the program if this is
-     * the last applet.
-     */
-    void appletClose() {
-
-        // The caller thread is event dispatch thread, so
-        // spawn a new thread to avoid blocking the event queue
-        // when calling appletShutdown.
-        //
-        final AppletPanel p = panel;
-
-        new Thread(null, new Runnable()
-        {
-            @Override
-            public void run()
-            {
-                appletShutdown(p);
-                appletPanels.removeElement(p);
-                dispose();
-
-                if (countApplets() == 0) {
-                    appletSystemExit();
-                }
-            }
-        },
-        "AppletCloser", 0, false).start();
-    }
-
-    /**
-     * Exit the program.
-     * Exit from the program (if not stand alone) - do no clean-up
-     */
-    private void appletSystemExit() {
-        if (factory.isStandalone())
-            System.exit(0);
-    }
-
-    /**
-     * Quit all viewers.
-     * Shutdown all viewers properly then
-     * exit from the program (if not stand alone)
-     */
-    protected void appletQuit()
-    {
-        // The caller thread is event dispatch thread, so
-        // spawn a new thread to avoid blocking the event queue
-        // when calling appletShutdown.
-        //
-        new Thread(null, new Runnable()
-        {
-            @Override
-            public void run()
-            {
-                for (Enumeration<AppletPanel> e = appletPanels.elements() ; e.hasMoreElements() ;) {
-                    AppletPanel p = e.nextElement();
-                    appletShutdown(p);
-                }
-                appletSystemExit();
-            }
-        },
-         "AppletQuit", 0, false).start();
-    }
-
-    /**
-     * Handle events.
-     */
-    public void processUserAction(ActionEvent evt) {
-
-        String label = ((MenuItem)evt.getSource()).getLabel();
-
-        if (amh.getMessage("menuitem.restart").equals(label)) {
-            appletRestart();
-            return;
-        }
-
-        if (amh.getMessage("menuitem.reload").equals(label)) {
-            appletReload();
-            return;
-        }
-
-        if (amh.getMessage("menuitem.clone").equals(label)) {
-            appletClone();
-            return;
-        }
-
-        if (amh.getMessage("menuitem.stop").equals(label)) {
-            appletStop();
-            return;
-        }
-
-        if (amh.getMessage("menuitem.save").equals(label)) {
-            appletSave();
-            return;
-        }
-
-        if (amh.getMessage("menuitem.start").equals(label)) {
-            appletStart();
-            return;
-        }
-
-        if (amh.getMessage("menuitem.tag").equals(label)) {
-            appletTag();
-            return;
-        }
-
-        if (amh.getMessage("menuitem.info").equals(label)) {
-            appletInfo();
-            return;
-        }
-
-        if (amh.getMessage("menuitem.encoding").equals(label)) {
-            appletCharacterEncoding();
-            return;
-        }
-
-        if (amh.getMessage("menuitem.edit").equals(label)) {
-            appletEdit();
-            return;
-        }
-
-        if (amh.getMessage("menuitem.print").equals(label)) {
-            appletPrint();
-            return;
-        }
-
-        if (amh.getMessage("menuitem.props").equals(label)) {
-            networkProperties();
-            return;
-        }
-
-        if (amh.getMessage("menuitem.close").equals(label)) {
-            appletClose();
-            return;
-        }
-
-        if (factory.isStandalone() && amh.getMessage("menuitem.quit").equals(label)) {
-            appletQuit();
-            return;
-        }
-        //statusMsgStream.println("evt = " + evt);
-    }
-
-    /**
-     * How many applets are running?
-     */
-
-    public static int countApplets() {
-        return appletPanels.size();
-    }
-
-
-    /**
-     * The current character.
-     */
-    static int c;
-
-    /**
-     * Scan spaces.
-     */
-    public static void skipSpace(Reader in) throws IOException {
-        while ((c >= 0) &&
-               ((c == ' ') || (c == '\t') || (c == '\n') || (c == '\r'))) {
-            c = in.read();
-        }
-    }
-
-    /**
-     * Scan identifier
-     */
-    public static String scanIdentifier(Reader in) throws IOException {
-        StringBuilder sb = new StringBuilder();
-        while (true) {
-            if (((c >= 'a') && (c <= 'z')) ||
-                ((c >= 'A') && (c <= 'Z')) ||
-                ((c >= '0') && (c <= '9')) || (c == '_')) {
-                sb.append((char) c);
-                c = in.read();
-            } else {
-                return sb.toString();
-            }
-        }
-    }
-
-    /**
-     * Scan tag
-     */
-    public static Hashtable<String, String> scanTag(Reader in) throws IOException {
-        Hashtable<String, String> atts = new Hashtable<>();
-        skipSpace(in);
-        while (c >= 0 && c != '>') {
-            String att = scanIdentifier(in);
-            String val = "";
-            skipSpace(in);
-            if (c == '=') {
-                int quote = -1;
-                c = in.read();
-                skipSpace(in);
-                if ((c == '\'') || (c == '\"')) {
-                    quote = c;
-                    c = in.read();
-                }
-                StringBuilder sb = new StringBuilder();
-                while ((c > 0) &&
-                       (((quote < 0) && (c != ' ') && (c != '\t') &&
-                         (c != '\n') && (c != '\r') && (c != '>'))
-                        || ((quote >= 0) && (c != quote)))) {
-                    sb.append((char) c);
-                    c = in.read();
-                }
-                if (c == quote) {
-                    c = in.read();
-                }
-                skipSpace(in);
-                val = sb.toString();
-            }
-            //statusMsgStream.println("PUT " + att + " = '" + val + "'");
-            if (! val.equals("")) {
-                atts.put(att.toLowerCase(java.util.Locale.ENGLISH), val);
-            }
-            while (true) {
-                if ((c == '>') || (c < 0) ||
-                    ((c >= 'a') && (c <= 'z')) ||
-                    ((c >= 'A') && (c <= 'Z')) ||
-                    ((c >= '0') && (c <= '9')) || (c == '_'))
-                    break;
-                c = in.read();
-            }
-            //skipSpace(in);
-        }
-        return atts;
-    }
-
-    /* values used for placement of AppletViewer's frames */
-    private static int x = 0;
-    private static int y = 0;
-    private static final int XDELTA = 30;
-    private static final int YDELTA = XDELTA;
-
-    static String encoding = null;
-
-    private static Reader makeReader(InputStream is) {
-        if (encoding != null) {
-            try {
-                return new BufferedReader(new InputStreamReader(is, encoding));
-            } catch (IOException x) { }
-        }
-        InputStreamReader r = new InputStreamReader(is);
-        encoding = r.getEncoding();
-        return new BufferedReader(r);
-    }
-
-    /**
-     * Scan an html file for {@code <applet>} tags
-     */
-    public static void parse(URL url, String enc) throws IOException {
-        encoding = enc;
-        parse(url, System.out, new StdAppletViewerFactory());
-    }
-
-    public static void parse(URL url) throws IOException {
-        parse(url, System.out, new StdAppletViewerFactory());
-    }
-
-    public static void parse(URL url, PrintStream statusMsgStream,
-                             AppletViewerFactory factory) throws IOException {
-        // <OBJECT> <EMBED> tag flags
-        boolean isAppletTag = false;
-        boolean isObjectTag = false;
-        boolean isEmbedTag = false;
-
-        // warning messages
-        String requiresNameWarning = amh.getMessage("parse.warning.requiresname");
-        String paramOutsideWarning = amh.getMessage("parse.warning.paramoutside");
-        String appletRequiresCodeWarning = amh.getMessage("parse.warning.applet.requirescode");
-        String appletRequiresHeightWarning = amh.getMessage("parse.warning.applet.requiresheight");
-        String appletRequiresWidthWarning = amh.getMessage("parse.warning.applet.requireswidth");
-        String objectRequiresCodeWarning = amh.getMessage("parse.warning.object.requirescode");
-        String objectRequiresHeightWarning = amh.getMessage("parse.warning.object.requiresheight");
-        String objectRequiresWidthWarning = amh.getMessage("parse.warning.object.requireswidth");
-        String embedRequiresCodeWarning = amh.getMessage("parse.warning.embed.requirescode");
-        String embedRequiresHeightWarning = amh.getMessage("parse.warning.embed.requiresheight");
-        String embedRequiresWidthWarning = amh.getMessage("parse.warning.embed.requireswidth");
-        String appNotLongerSupportedWarning = amh.getMessage("parse.warning.appnotLongersupported");
-
-        java.net.URLConnection conn = url.openConnection();
-        Reader in = makeReader(conn.getInputStream());
-        /* The original URL may have been redirected - this
-         * sets it to whatever URL/codebase we ended up getting
-         */
-        url = conn.getURL();
-
-        int ydisp = 1;
-        Hashtable<String, String> atts = null;
-
-        while(true) {
-            c = in.read();
-            if (c == -1)
-                break;
-
-            if (c == '<') {
-                c = in.read();
-                if (c == '/') {
-                    c = in.read();
-                    String nm = scanIdentifier(in);
-                    if (nm.equalsIgnoreCase("applet") ||
-                        nm.equalsIgnoreCase("object") ||
-                        nm.equalsIgnoreCase("embed")) {
-
-                        // We can't test for a code tag until </OBJECT>
-                        // because it is a parameter, not an attribute.
-                        if(isObjectTag) {
-                            if (atts.get("code") == null && atts.get("object") == null) {
-                                statusMsgStream.println(objectRequiresCodeWarning);
-                                atts = null;
-                            }
-                        }
-
-                        if (atts != null) {
-                            // XXX 5/18 In general this code just simply
-                            // shouldn't be part of parsing.  It's presence
-                            // causes things to be a little too much of a
-                            // hack.
-                            factory.createAppletViewer(x, y, url, atts);
-                            x += XDELTA;
-                            y += YDELTA;
-                            // make sure we don't go too far!
-                            Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
-                            if ((x > d.width - 300) || (y > d.height - 300)) {
-                                x = 0;
-                                y = 2 * ydisp * YDELTA;
-                                ydisp++;
-                            }
-                        }
-                        atts = null;
-                        isAppletTag = false;
-                        isObjectTag = false;
-                        isEmbedTag = false;
-                    }
-                }
-                else {
-                    String nm = scanIdentifier(in);
-                    if (nm.equalsIgnoreCase("param")) {
-                        Hashtable<String, String> t = scanTag(in);
-                        String att = t.get("name");
-                        if (att == null) {
-                            statusMsgStream.println(requiresNameWarning);
-                        } else {
-                            String val = t.get("value");
-                            if (val == null) {
-                                statusMsgStream.println(requiresNameWarning);
-                            } else if (atts != null) {
-                                atts.put(att.toLowerCase(), val);
-                            } else {
-                                statusMsgStream.println(paramOutsideWarning);
-                            }
-                        }
-                    }
-                    else if (nm.equalsIgnoreCase("applet")) {
-                        isAppletTag = true;
-                        atts = scanTag(in);
-                        if (atts.get("code") == null && atts.get("object") == null) {
-                            statusMsgStream.println(appletRequiresCodeWarning);
-                            atts = null;
-                        } else if (atts.get("width") == null) {
-                            statusMsgStream.println(appletRequiresWidthWarning);
-                            atts = null;
-                        } else if (atts.get("height") == null) {
-                            statusMsgStream.println(appletRequiresHeightWarning);
-                            atts = null;
-                        }
-                    }
-                    else if (nm.equalsIgnoreCase("object")) {
-                        isObjectTag = true;
-                        atts = scanTag(in);
-                        // The <OBJECT> attribute codebase isn't what
-                        // we want. If its defined, remove it.
-                        if(atts.get("codebase") != null) {
-                            atts.remove("codebase");
-                        }
-
-                        if (atts.get("width") == null) {
-                            statusMsgStream.println(objectRequiresWidthWarning);
-                            atts = null;
-                        } else if (atts.get("height") == null) {
-                            statusMsgStream.println(objectRequiresHeightWarning);
-                            atts = null;
-                        }
-                    }
-                    else if (nm.equalsIgnoreCase("embed")) {
-                        isEmbedTag = true;
-                        atts = scanTag(in);
-
-                        if (atts.get("code") == null && atts.get("object") == null) {
-                            statusMsgStream.println(embedRequiresCodeWarning);
-                            atts = null;
-                        } else if (atts.get("width") == null) {
-                            statusMsgStream.println(embedRequiresWidthWarning);
-                            atts = null;
-                        } else if (atts.get("height") == null) {
-                            statusMsgStream.println(embedRequiresHeightWarning);
-                            atts = null;
-                        }
-                    }
-                    else if (nm.equalsIgnoreCase("app")) {
-                        statusMsgStream.println(appNotLongerSupportedWarning);
-                        Hashtable<String, String> atts2 = scanTag(in);
-                        nm = atts2.get("class");
-                        if (nm != null) {
-                            atts2.remove("class");
-                            atts2.put("code", nm + ".class");
-                        }
-                        nm = atts2.get("src");
-                        if (nm != null) {
-                            atts2.remove("src");
-                            atts2.put("codebase", nm);
-                        }
-                        if (atts2.get("width") == null) {
-                            atts2.put("width", "100");
-                        }
-                        if (atts2.get("height") == null) {
-                            atts2.put("height", "100");
-                        }
-                        printTag(statusMsgStream, atts2);
-                        statusMsgStream.println();
-                    }
-                }
-            }
-        }
-        in.close();
-    }
-
-    /**
-     * Old main entry point.
-     *
-     * @deprecated
-     */
-    @Deprecated
-    public static void main(String argv[]) {
-        // re-route everything to the new main entry point
-        Main.main(argv);
-    }
-
-    private static AppletMessageHandler amh = new AppletMessageHandler("appletviewer");
-
-    private static void checkConnect(URL url)
-    {
-        SecurityManager security = System.getSecurityManager();
-        if (security != null) {
-            try {
-                java.security.Permission perm =
-                    url.openConnection().getPermission();
-                if (perm != null)
-                    security.checkPermission(perm);
-                else
-                    security.checkConnect(url.getHost(), url.getPort());
-            } catch (java.io.IOException ioe) {
-                    security.checkConnect(url.getHost(), url.getPort());
-            }
-        }
-    }
-}