Created
October 17, 2013 06:43
-
-
Save zakki/7020106 to your computer and use it in GitHub Desktop.
Swing Explorer Applet Support
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Index: src/org/swingexplorer/ActRefresh.java | |
| =================================================================== | |
| RCS file: /cvs/swingexplorer/src/org/swingexplorer/ActRefresh.java,v | |
| retrieving revision 1.4 | |
| diff -u -r1.4 ActRefresh.java | |
| --- src/org/swingexplorer/ActRefresh.java 9 May 2009 14:19:04 -0000 1.4 | |
| +++ src/org/swingexplorer/ActRefresh.java 26 Jun 2009 01:14:54 -0000 | |
| @@ -21,36 +21,29 @@ | |
| package org.swingexplorer; | |
| -import java.awt.AWTEvent; | |
| import java.awt.Component; | |
| import java.awt.Container; | |
| import java.awt.Dialog; | |
| import java.awt.Frame; | |
| -import java.awt.Toolkit; | |
| import java.awt.Window; | |
| -import java.awt.event.AWTEventListener; | |
| import java.awt.event.ActionEvent; | |
| -import java.awt.event.FocusEvent; | |
| import java.awt.event.HierarchyEvent; | |
| -import java.awt.event.KeyEvent; | |
| import java.lang.reflect.Method; | |
| import java.util.ArrayList; | |
| import java.util.Enumeration; | |
| -import java.util.LinkedList; | |
| import javax.accessibility.Accessible; | |
| import javax.swing.JComboBox; | |
| import javax.swing.JComponent; | |
| import javax.swing.JLayeredPane; | |
| -import javax.swing.JMenuBar; | |
| import javax.swing.JRootPane; | |
| import javax.swing.JToolTip; | |
| import javax.swing.SwingUtilities; | |
| import javax.swing.Timer; | |
| -import javax.swing.ToolTipManager; | |
| import javax.swing.tree.DefaultMutableTreeNode; | |
| import org.swingexplorer.PNLComponentTree.TreeNodeObject; | |
| +import org.swingexplorer.instrument.Agent; | |
| /** | |
| @@ -172,51 +165,34 @@ | |
| // unreferenced windows/dialogs | |
| System.gc(); | |
| - Window[] allWindows; | |
| + Container[] allWindows; | |
| - boolean forJDK15; | |
| - try { | |
| - // Try JRE 1.6 first through reflection | |
| - Method meth = Window.class.getMethod("getWindows", new Class[0]); | |
| - allWindows = (Window[])meth.invoke(Window.class, new Object[0]); | |
| - forJDK15 = false; | |
| - } catch (Exception e) { | |
| - forJDK15 = true; | |
| - // We got exception try for JRE 1.5 | |
| - Window[] frames = Frame.getFrames(); | |
| - | |
| - // obtain list of ownerless dialogs | |
| - Frame sharedOwner = getSharedOwnerFrame(); | |
| - Window[] ownerlessDialogs = sharedOwner == null ? new Window[0] : sharedOwner.getOwnedWindows(); | |
| - allWindows = new Window[frames.length + ownerlessDialogs.length]; | |
| - | |
| - // merge dialogs and windows | |
| - System.arraycopy(frames, 0, allWindows, 0, frames.length); | |
| - System.arraycopy(ownerlessDialogs, 0, allWindows, frames.length, ownerlessDialogs.length); | |
| - | |
| - if(sharedOwner == null) { | |
| - Log.general.warn("Dialog list is not in this Java configuration. Try to run it with JRE 1.6 or higher or with full security privilegies."); | |
| - } | |
| - // End JDK 1.5 | |
| - } | |
| + allWindows = getWindows(); | |
| // search for SwingExplorer's frame and exclude it | |
| // from resulting list. Also exclude windows to those | |
| // Swing Explorer is owner | |
| Window winExplorer = SwingUtilities.getWindowAncestor(pnlComponentTree); | |
| - ArrayList<Window> list = new ArrayList<Window>(); | |
| - for(Window curWindow: allWindows) { | |
| + ArrayList<Container> list = new ArrayList<Container>(); | |
| + for(Container curWindow: allWindows) { | |
| if(!SysUtils.isShowExplorerWindow() && | |
| - (curWindow == winExplorer || curWindow.getOwner() == winExplorer)) { | |
| + (curWindow == winExplorer || | |
| + (curWindow instanceof Window && ((Window)curWindow).getOwner() == winExplorer) || | |
| + (curWindow.getParent() == winExplorer))) { | |
| continue; | |
| } | |
| list.add(curWindow); | |
| } | |
| - addChildren(root, list.toArray(new Window[list.size()]), forJDK15); | |
| + addChildren(root, list.toArray(new Container[list.size()]), false); | |
| + } | |
| + | |
| + Container[] getWindows() { | |
| + ArrayList<Container> rootContainers = Agent.getRootContainers(); | |
| + return rootContainers.toArray(new Container[rootContainers.size()]); | |
| } | |
| - String getWindowTitle(Window wnd) { | |
| + String getWindowTitle(Container wnd) { | |
| String title = wnd.getClass().getSimpleName(); | |
| if(wnd instanceof Frame) { | |
| title = title + "(" + ((Frame)wnd).getTitle() + ")"; | |
| @@ -226,19 +202,19 @@ | |
| return title; | |
| } | |
| - void addChildren(DefaultMutableTreeNode root, Window[] windows, boolean forJRE15) { | |
| + void addChildren(DefaultMutableTreeNode root, Container[] windows, boolean forJRE15) { | |
| for (int i = 0; i < windows.length; i++) { | |
| TreeNodeObject object = new TreeNodeObject(windows[i], getWindowTitle(windows[i])); | |
| DefaultMutableTreeNode child = new DefaultMutableTreeNode(object); | |
| root.add(child); | |
| addChildren(child, windows[i]); | |
| - if(forJRE15) { | |
| - // for JRE 1.5 we need to get also owned dialogs since they are not | |
| - // available from Frame.getFrames() | |
| - Window[] ownedWnds = windows[i].getOwnedWindows(); | |
| - addChildren(root, ownedWnds, forJRE15); | |
| - } | |
| +// if(forJRE15) { | |
| +// // for JRE 1.5 we need to get also owned dialogs since they are not | |
| +// // available from Frame.getFrames() | |
| +// Window[] ownedWnds = windows[i].getOwnedWindows(); | |
| +// addChildren(root, ownedWnds, forJRE15); | |
| +// } | |
| } | |
| } | |
| @@ -246,6 +222,9 @@ | |
| void addChildren(DefaultMutableTreeNode node, Container cont) { | |
| for(int i = 0; i<cont.getComponentCount(); i++) { | |
| Component comp = cont.getComponent(i); | |
| + if (comp instanceof java.applet.Applet) { | |
| + continue; | |
| + } | |
| // first try to get bean's name | |
| String name = comp.getName(); | |
| Index: src/org/swingexplorer/PNLComponentTree.java | |
| =================================================================== | |
| RCS file: /cvs/swingexplorer/src/org/swingexplorer/PNLComponentTree.java,v | |
| retrieving revision 1.10 | |
| diff -u -r1.10 PNLComponentTree.java | |
| --- src/org/swingexplorer/PNLComponentTree.java 26 Mar 2009 14:43:24 -0000 1.10 | |
| +++ src/org/swingexplorer/PNLComponentTree.java 26 Jun 2009 01:14:55 -0000 | |
| @@ -169,7 +169,7 @@ | |
| Enumeration<TreePath> expandPaths = treDisplayed.getExpandedDescendants(pathToRoot); | |
| // set new root | |
| - TreePath path = getComponentPath(treAll, model.getDisplayedComponent()); | |
| + TreePath path = getComponentPath(treAll, model.getDisplayedComponent()); | |
| DefaultMutableTreeNode displayedRoot = (DefaultMutableTreeNode)path.getLastPathComponent(); | |
| getTreeModel(treDisplayed).setRoot(displayedRoot); | |
| Index: src/org/swingexplorer/instrument/Agent.java | |
| =================================================================== | |
| RCS file: /cvs/swingexplorer/src/org/swingexplorer/instrument/Agent.java,v | |
| retrieving revision 1.6 | |
| diff -u -r1.6 Agent.java | |
| --- src/org/swingexplorer/instrument/Agent.java 26 Mar 2009 14:42:40 -0000 1.6 | |
| +++ src/org/swingexplorer/instrument/Agent.java 26 Jun 2009 01:14:58 -0000 | |
| @@ -21,11 +21,13 @@ | |
| package org.swingexplorer.instrument; | |
| import java.awt.Component; | |
| +import java.awt.Container; | |
| import java.lang.instrument.ClassFileTransformer; | |
| import java.lang.instrument.IllegalClassFormatException; | |
| import java.lang.instrument.Instrumentation; | |
| import java.security.ProtectionDomain; | |
| import java.text.MessageFormat; | |
| +import java.util.ArrayList; | |
| import java.util.Hashtable; | |
| import java.util.Vector; | |
| import java.util.WeakHashMap; | |
| @@ -63,6 +65,8 @@ | |
| // keeps all stack traces o | |
| static WeakHashMap<Component, StackTraceElement[]> componentAddImplStackTraces = new WeakHashMap<Component, StackTraceElement[]>(); | |
| + static WeakHashMap<Container, Boolean> rootContainers = new WeakHashMap<Container, Boolean>(); | |
| + | |
| public static void premain(String agentArguments, Instrumentation instrumentation) { | |
| instrumentation.addTransformer(new Transformer()); | |
| @@ -182,6 +186,24 @@ | |
| return componentAddImplStackTraces.get(component); | |
| } | |
| + public static void addRootContainer(Container container) { | |
| + synchronized (rootContainers) { | |
| + rootContainers.put(container, Boolean.TRUE); | |
| + } | |
| + } | |
| + | |
| + public static ArrayList<Container> getRootContainers() { | |
| + ArrayList<Container> containers = new ArrayList<Container>(rootContainers.size()); | |
| + synchronized (rootContainers) { | |
| + for (Container container : rootContainers.keySet()) { | |
| + if (container != null) { | |
| + containers.add(container); | |
| + } | |
| + } | |
| + } | |
| + return containers; | |
| + } | |
| + | |
| static class Transformer implements ClassFileTransformer { | |
| boolean first = true; | |
| @@ -209,6 +231,54 @@ | |
| } | |
| } | |
| + // check java.awt.Window | |
| + try { | |
| + if(className.equals("java.awt.Window")) { | |
| + CtClass ctClass = pool.get(className); | |
| + CtConstructor[] ctors = ctClass.getDeclaredConstructors(); | |
| + for(CtConstructor constr : ctors) { | |
| + try { | |
| + constr.insertAfter("{org.swingexplorer.instrument.Agent.addRootContainer(this);}"); | |
| + debug("instrumenting constructor: " + ctClass.getName() + " " + constr.getName() + constr.getSignature()); | |
| + } catch(Exception ex) { | |
| + error("Error instrumenting constructor: " + ctClass.getName() + " " + constr.getName() + constr.getSignature()); | |
| + first = false; | |
| + } | |
| + } | |
| + debug("Instrumented: " + ctClass.getName()); | |
| + return ctClass.toBytecode(); | |
| + } | |
| + } catch(Exception ex) { | |
| + error("Error instrumenting class: " + className); | |
| + if(first) { | |
| + error(ex); | |
| + first = false; | |
| + } | |
| + } | |
| + try { | |
| + if(className.equals("java.applet.Applet")) { | |
| + CtClass ctClass = pool.get(className); | |
| + CtConstructor[] ctors = ctClass.getDeclaredConstructors(); | |
| + for(CtConstructor constr : ctors) { | |
| + try { | |
| + constr.insertAfter("{org.swingexplorer.instrument.Agent.addRootContainer(this);}"); | |
| + debug("instrumenting constructor: " + ctClass.getName() + " " + constr.getName() + constr.getSignature()); | |
| + } catch(Exception ex) { | |
| + error("Error instrumenting constructor: " + ctClass.getName() + " " + constr.getName() + constr.getSignature()); | |
| + first = false; | |
| + } | |
| + } | |
| + debug("Instrumented: " + ctClass.getName()); | |
| + return ctClass.toBytecode(); | |
| + } | |
| + } catch(Exception ex) { | |
| + error("Error instrumenting class: " + className); | |
| + if(first) { | |
| + error(ex); | |
| + first = false; | |
| + } | |
| + } | |
| + | |
| // exclude javassist classes non-swing classes |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment