home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2003 January / maximum-cd-2003-01.iso / Software / Apps / OperawithJava / ow32enen700b1j.exe / OPERA.JAR / opera / PluginPanel.class (.txt) < prev    next >
Encoding:
Java Class File  |  2002-11-07  |  10.6 KB  |  518 lines

  1. package opera;
  2.  
  3. import java.applet.Applet;
  4. import java.applet.AppletContext;
  5. import java.applet.AppletStub;
  6. import java.awt.BorderLayout;
  7. import java.awt.FontMetrics;
  8. import java.awt.Frame;
  9. import java.awt.Graphics;
  10. import java.awt.Panel;
  11. import java.lang.reflect.Constructor;
  12. import java.net.MalformedURLException;
  13. import java.net.URL;
  14. import java.util.Hashtable;
  15. import java.util.Iterator;
  16. import java.util.StringTokenizer;
  17. import java.util.Vector;
  18.  
  19. public class PluginPanel extends Panel implements AppletStub, Runnable {
  20.    private static final int APPSTATE_UNKNOWN = 0;
  21.    private static final int APPSTATE_LOADING = 1;
  22.    private static final int APPSTATE_NOTFOUND = 2;
  23.    private static final int APPSTATE_STOPPED = 3;
  24.    private static final int APPSTATE_RUNNING = 4;
  25.    private static final int APPSTATE_CRASHED = 5;
  26.    private static final int APPSTATE_DESTROYED = 6;
  27.    private static final int APPSTATE_INTERRUPTED = 7;
  28.    private static final int APPSTATE_CLASSFORMATERROR = 8;
  29.    private int appletState = 0;
  30.    private Applet applet;
  31.    private PluginContext context;
  32.    private int inline_elm;
  33.    private URL codeBase;
  34.    private URL docBase;
  35.    private Hashtable params;
  36.    private Hashtable attr;
  37.    private PluginClassLoader loader;
  38.    private Thread loaderThread = null;
  39.    private Thread destroyThread = null;
  40.    private static Hashtable classLoaders = new Hashtable();
  41.    private static final int noRefMax = 10;
  42.    private static Vector noRefLoaders = new Vector();
  43.  
  44.    private int getWidthParam() {
  45.       if (this.attr != null) {
  46.          String var1 = (String)this.attr.get("width");
  47.          if (var1 != null) {
  48.             return new Integer(var1);
  49.          }
  50.       }
  51.  
  52.       return 150;
  53.    }
  54.  
  55.    private int getHeightParam() {
  56.       if (this.attr != null) {
  57.          String var1 = (String)this.attr.get("height");
  58.          if (var1 != null) {
  59.             return new Integer(var1);
  60.          }
  61.       }
  62.  
  63.       return 150;
  64.    }
  65.  
  66.    public PluginPanel(PluginContext var1, Hashtable var2, Hashtable var3, URL var4, int var5) {
  67.       try {
  68.          this.setLayout(new BorderLayout());
  69.          this.context = var1;
  70.          this.attr = var2;
  71.          this.params = var3;
  72.          this.docBase = var4;
  73.          this.inline_elm = var5;
  74.          String var6 = this.getParameter("java_codebase");
  75.          if (var6 == null) {
  76.             var6 = this.getParameter("codebase");
  77.          }
  78.  
  79.          if (var6 != null) {
  80.             if (!var6.endsWith("/")) {
  81.                var6 = var6 + "/";
  82.             }
  83.  
  84.             try {
  85.                this.codeBase = new URL(this.docBase, var6);
  86.             } catch (MalformedURLException var11) {
  87.             }
  88.          }
  89.  
  90.          if (this.codeBase == null) {
  91.             String var7 = this.docBase.getFile();
  92.             int var8 = var7.lastIndexOf(47);
  93.             if (var8 >= 0 && var8 < var7.length() - 1) {
  94.                try {
  95.                   this.codeBase = new URL(this.docBase, var7.substring(0, var8 + 1));
  96.                } catch (MalformedURLException var10) {
  97.                   var10.printStackTrace(System.err);
  98.                }
  99.             }
  100.          }
  101.  
  102.          if (this.codeBase == null) {
  103.             this.codeBase = this.docBase;
  104.          }
  105.  
  106.          String var13 = this.getParameter("java_archive");
  107.          if (var13 == null) {
  108.             var13 = this.getParameter("archive");
  109.          }
  110.  
  111.          this.loader = getClassLoader(this.codeBase, this.docBase, var13);
  112.          this.loader.grab();
  113.          if (var1 != null) {
  114.             var1.setClassLoader(this.loader);
  115.          }
  116.       } catch (Exception var12) {
  117.          var12.printStackTrace(System.err);
  118.       }
  119.  
  120.    }
  121.  
  122.    static PluginClassLoader getClassLoader(URL var0, URL var1, String var2) {
  123.       String var3 = var0.toString();
  124.       if (var2 != null) {
  125.          var3 = var3 + "," + var2.trim();
  126.       }
  127.  
  128.       PluginClassLoader var4 = (PluginClassLoader)classLoaders.get(var3);
  129.       if (var4 == null) {
  130.          var4 = new PluginClassLoader(var0, var3);
  131.          if (var2 != null) {
  132.             StringTokenizer var5 = new StringTokenizer(var2, ",", false);
  133.  
  134.             while(var5.hasMoreTokens()) {
  135.                String var6 = var5.nextToken().trim();
  136.  
  137.                try {
  138.                   var4.addJar(new URL(var0, var6));
  139.                } catch (IllegalArgumentException var9) {
  140.                   var9.printStackTrace(System.err);
  141.                } catch (MalformedURLException var10) {
  142.                   var10.printStackTrace(System.err);
  143.                }
  144.             }
  145.          }
  146.  
  147.          var4.addJar(var0);
  148.          if (var1 != var0) {
  149.             var4.addJar(var1);
  150.          }
  151.  
  152.          classLoaders.put(var3, var4);
  153.       } else {
  154.          noRefLoaders.remove(var4);
  155.       }
  156.  
  157.       return var4;
  158.    }
  159.  
  160.    static void cacheClassLoader(PluginClassLoader var0) {
  161.       if (noRefLoaders.size() >= 10) {
  162.          classLoaders.remove(((PluginClassLoader)noRefLoaders.get(0)).getKey());
  163.          noRefLoaders.remove(0);
  164.       }
  165.  
  166.       noRefLoaders.add(var0);
  167.    }
  168.  
  169.    static void clearClassLoaderCache() {
  170.       Iterator var0 = classLoaders.values().iterator();
  171.  
  172.       while(var0.hasNext()) {
  173.          PluginClassLoader var1 = (PluginClassLoader)var0.next();
  174.          if (var1.getUsageCount() == 0) {
  175.             var0.remove();
  176.          }
  177.       }
  178.  
  179.    }
  180.  
  181.    static void printClassLoaders() {
  182.       System.out.println("Classloaders:");
  183.  
  184.       for(PluginClassLoader var1 : classLoaders.values()) {
  185.          System.out.println(var1.getKey());
  186.       }
  187.  
  188.    }
  189.  
  190.    static Class findClass(String var0, String var1) {
  191.       try {
  192.          int var3 = var1.lastIndexOf(47);
  193.          URL var2;
  194.          if (var3 >= 0 && var3 < var1.length() - 1) {
  195.             var2 = new URL(var1.substring(0, var3 + 1));
  196.          } else {
  197.             var2 = new URL(var1);
  198.          }
  199.  
  200.          PluginClassLoader var4 = getClassLoader(var2, var2, (String)null);
  201.          if (var4 != null) {
  202.             var4.grab();
  203.             var4.addJar(var2);
  204.             ThreadGroup var6 = var4.getThreadGroup();
  205.             FindClassThread var7 = new FindClassThread(var6, var4, var0);
  206.             Object var8 = var7.syncObject;
  207.             Class var5;
  208.             synchronized(var8) {
  209.                var7.start();
  210.  
  211.                try {
  212.                   var7.syncObject.wait();
  213.                } catch (InterruptedException var11) {
  214.                }
  215.  
  216.                var5 = var7.found_class;
  217.             }
  218.  
  219.             Object var14 = null;
  220.             var4.release();
  221.             return var5;
  222.          } else {
  223.             return null;
  224.          }
  225.       } catch (Exception var13) {
  226.          var13.printStackTrace(System.out);
  227.          return null;
  228.       }
  229.    }
  230.  
  231.    void resizeEmbedBox(int var1, int var2) {
  232.       Frame var3 = (Frame)this.getParent();
  233.       if (var3 != null) {
  234.          var3.setSize(var1, var2);
  235.       }
  236.  
  237.       this.setSize(var1, var2);
  238.       if (this.applet != null) {
  239.          this.applet.setSize(var1, var2);
  240.       }
  241.  
  242.       this.validate();
  243.       this.attr.put("width", String.valueOf(var1));
  244.       this.attr.put("height", String.valueOf(var2));
  245.    }
  246.  
  247.    public void appletResize(int var1, int var2) {
  248.       this.setSize(var1, var2);
  249.    }
  250.  
  251.    public AppletContext getAppletContext() {
  252.       return this.context;
  253.    }
  254.  
  255.    public URL getCodeBase() {
  256.       return this.codeBase;
  257.    }
  258.  
  259.    public URL getDocumentBase() {
  260.       return this.docBase;
  261.    }
  262.  
  263.    public String getParameter(String var1) {
  264.       String var2 = (String)this.params.get(var1.toLowerCase());
  265.       if (var2 == null) {
  266.          var2 = (String)this.attr.get(var1.toLowerCase());
  267.       }
  268.  
  269.       return var2;
  270.    }
  271.  
  272.    public boolean isActive() {
  273.       return this.appletState == 4;
  274.    }
  275.  
  276.    public void loadApplet() {
  277.       try {
  278.          ThreadGroup var1 = this.loader.getThreadGroup();
  279.          this.loaderThread = new Thread(var1, this);
  280.          this.loaderThread.start();
  281.       } catch (Exception var2) {
  282.          var2.printStackTrace(System.err);
  283.       }
  284.  
  285.    }
  286.  
  287.    public void startApplet() {
  288.       try {
  289.          if (this.applet != null && this.appletState == 3) {
  290.             this.applet.resize(this.getWidthParam(), this.getHeightParam());
  291.             this.applet.start();
  292.             this.appletState = 4;
  293.             this.applet.validate();
  294.             this.applet.setVisible(true);
  295.             this.context.showStatus("Applet started.");
  296.          }
  297.       } catch (Exception var2) {
  298.          var2.printStackTrace(System.err);
  299.          if (this.appletState != 4) {
  300.             this.appletState = 5;
  301.             this.repaint();
  302.          }
  303.       }
  304.  
  305.    }
  306.  
  307.    public void stopApplet() {
  308.       if (this.applet != null && this.appletState == 4) {
  309.          try {
  310.             this.applet.stop();
  311.          } catch (Exception var2) {
  312.             var2.printStackTrace(System.err);
  313.          }
  314.  
  315.          this.appletState = 3;
  316.       }
  317.  
  318.    }
  319.  
  320.    public void destroy() {
  321.       if (this.context != null) {
  322.          this.context.destroyPanel(this);
  323.       }
  324.  
  325.    }
  326.  
  327.    public void destroyApplet() {
  328.       try {
  329.          if (this.loaderThread != null) {
  330.             try {
  331.                this.loaderThread.interrupt();
  332.             } catch (Exception var3) {
  333.                var3.printStackTrace(System.err);
  334.             }
  335.  
  336.             this.loaderThread = null;
  337.          }
  338.  
  339.          if (this.loader != null) {
  340.             this.destroyThread = new Thread(this.loader.getThreadGroup(), this);
  341.             this.destroyThread.start();
  342.             ReleaseLoaderThread var1 = new ReleaseLoaderThread(this.loader);
  343.             ((Thread)var1).start();
  344.          }
  345.       } catch (Exception var4) {
  346.          var4.printStackTrace(System.err);
  347.       } catch (Error var5) {
  348.          var5.printStackTrace(System.err);
  349.       }
  350.  
  351.    }
  352.  
  353.    public Applet getApplet() {
  354.       return this.applet;
  355.    }
  356.  
  357.    public void run() {
  358.       if (Thread.currentThread() == this.destroyThread) {
  359.          if (this.applet != null) {
  360.             if (this.appletState == 4) {
  361.                this.stopApplet();
  362.             }
  363.  
  364.             try {
  365.                this.applet.destroy();
  366.             } catch (Exception var11) {
  367.                var11.printStackTrace(System.err);
  368.             }
  369.  
  370.             this.applet = null;
  371.             this.appletState = 6;
  372.          }
  373.  
  374.          this.destroyThread = null;
  375.       } else {
  376.          try {
  377.             String var1 = this.getParameter("java_code");
  378.             if (var1 == null) {
  379.                var1 = this.getParameter("code");
  380.             }
  381.  
  382.             if (var1 != null) {
  383.                int var2 = var1.length();
  384.                String var3 = var1;
  385.                if (var2 > 6 && var1.startsWith(".class", var2 - 6)) {
  386.                   var3 = var1.substring(0, var2 - 6);
  387.                }
  388.  
  389.                this.appletState = 1;
  390.                this.repaint();
  391.                Class var4 = this.loader.loadClass(var3);
  392.                if (var4 != null) {
  393.                   this.applet = (Applet)var4.newInstance();
  394.                   if (this.applet != null) {
  395.                      this.appletState = 3;
  396.                      this.repaint();
  397.                      this.applet.setStub(this);
  398.                      this.applet.setVisible(false);
  399.                      this.add("Center", this.applet);
  400.                      this.validate();
  401.                      this.setSize(this.getWidthParam(), this.getHeightParam());
  402.                      this.applet.resize(this.getWidthParam(), this.getHeightParam());
  403.                      this.context.showStatus("Initializing applet.");
  404.  
  405.                      try {
  406.                         this.applet.init();
  407.                         this.validate();
  408.                         this.startApplet();
  409.                      } catch (Exception var6) {
  410.                         var6.printStackTrace(System.err);
  411.                         this.appletState = 5;
  412.                         this.repaint();
  413.                      }
  414.                   } else {
  415.                      this.appletState = 2;
  416.                      this.repaint();
  417.                   }
  418.                } else {
  419.                   this.appletState = 2;
  420.                   this.repaint();
  421.                }
  422.             }
  423.  
  424.             this.loaderThread = null;
  425.          } catch (ClassNotFoundException var7) {
  426.             this.appletState = 2;
  427.             this.repaint();
  428.             this.loaderThread = null;
  429.          } catch (Exception var8) {
  430.             this.appletState = 5;
  431.             this.repaint();
  432.             var8.printStackTrace(System.err);
  433.             this.loaderThread = null;
  434.          } catch (ClassFormatError var9) {
  435.             this.appletState = 8;
  436.             this.repaint();
  437.             var9.printStackTrace(System.err);
  438.          } catch (Error var10) {
  439.             this.appletState = 5;
  440.             this.repaint();
  441.             var10.printStackTrace(System.err);
  442.             this.loaderThread = null;
  443.          }
  444.  
  445.          if (this.context != null && this.inline_elm != 0) {
  446.             this.context.setLoadingFinished(this.inline_elm);
  447.             this.inline_elm = 0;
  448.          }
  449.       }
  450.  
  451.    }
  452.  
  453.    public void paint(Graphics var1) {
  454.       try {
  455.          if (this.appletState != 0 && this.appletState != 4) {
  456.             FontMetrics var2 = var1.getFontMetrics();
  457.             String var3;
  458.             switch (this.appletState) {
  459.                case 1:
  460.                   var3 = "Loading applet...";
  461.                   break;
  462.                case 2:
  463.                   var3 = "Applet not found.";
  464.                   break;
  465.                case 3:
  466.                   var3 = "Applet loaded.";
  467.                   break;
  468.                case 4:
  469.                default:
  470.                   var3 = "";
  471.                   break;
  472.                case 5:
  473.                   var3 = "Applet crashed.";
  474.                   break;
  475.                case 6:
  476.                   var3 = "Applet destroyed.";
  477.                   break;
  478.                case 7:
  479.                   var3 = "Loading interrupted.";
  480.                   break;
  481.                case 8:
  482.                   var3 = "Invalid bytecode.";
  483.             }
  484.  
  485.             int var4 = var2.stringWidth(var3);
  486.             int var5 = (this.getWidth() - var4) / 2;
  487.             if (var5 < 0) {
  488.                var5 = 0;
  489.             }
  490.  
  491.             var1.drawString(var3, var5, this.getHeight() / 2);
  492.          }
  493.       } catch (Exception var6) {
  494.          var6.printStackTrace(System.err);
  495.       }
  496.  
  497.    }
  498.  
  499.    private static PluginPanel newPanel(int var0, int var1, int var2, String var3, String[] var4, String[] var5, String[] var6, String[] var7) {
  500.       try {
  501.          PluginContext var8 = PluginContextManager.getContext(var1);
  502.          PluginPanel var9 = var8.newPanel(var4, var5, var6, var7, var3, var2);
  503.          String var10 = System.getProperty("browser.opera.frameClassName");
  504.          Class var11 = Class.forName(var10, true, (ClassLoader)null);
  505.          Class[] var12 = new Class[]{Integer.TYPE};
  506.          Object[] var13 = new Object[]{new Integer(var0)};
  507.          Constructor var14 = var11.getConstructor(var12);
  508.          Frame var15 = (Frame)var14.newInstance(var13);
  509.          var15.add(var9);
  510.          var9.loadApplet();
  511.          return var9;
  512.       } catch (Exception var16) {
  513.          var16.printStackTrace(System.err);
  514.          return null;
  515.       }
  516.    }
  517. }
  518.