Skip to content

Instantly share code, notes, and snippets.

@zakki
Created October 17, 2013 06:43
Show Gist options
  • Select an option

  • Save zakki/7020106 to your computer and use it in GitHub Desktop.

Select an option

Save zakki/7020106 to your computer and use it in GitHub Desktop.
Swing Explorer Applet Support
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