001 /** 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: Nov 28, 2002 005 * Time: 2:37:43 AM 006 */ 007 008 package EVolve.visualization.XYViz.ValRefViz.HotSpotViz; 009 010 import java.awt.event.ActionEvent; 011 import java.awt.event.ActionListener; 012 import java.awt.event.KeyEvent; 013 import java.util.ArrayList; 014 import java.util.HashMap; 015 import java.util.Iterator; 016 import java.util.Stack; 017 018 import javax.swing.JMenuItem; 019 020 import EVolve.data.Element; 021 import EVolve.util.ThreadChooser; 022 import EVolve.util.painters.StackHotspotPainter; 023 import EVolve.util.painters.Painter; 024 import EVolve.visualization.AutoImage; 025 import EVolve.visualization.Dimension; 026 import EVolve.visualization.ReferenceDimension; 027 import EVolve.visualization.ValueDimension; 028 029 public class StackHotspotViz extends HotSpotVisualization{ 030 private ArrayList menuList; 031 private String dataFilterName[]; 032 private JMenuItem itemChangThread; 033 private HashMap methodStacks; 034 private ThreadChooser td; 035 private Stack stack; 036 037 public StackHotspotViz() { 038 super(); 039 dataFilterName = new String[2]; 040 041 dataFilterName[0] = "Bytecode"; 042 dataFilterName[1] = "Method"; 043 044 menuList = new ArrayList(); 045 td = new ThreadChooser(imageMap,false); 046 painters = new Painter[1]; 047 painters[0] = new StackHotspotPainter(); 048 } 049 050 public Dimension[] createDimension() { 051 Dimension [] returnDimension = new Dimension[3]; 052 053 xAxis = new ValueDimension(); 054 yAxis = new ReferenceDimension(true); 055 zAxis = new ReferenceDimension(); 056 057 returnDimension[0] = xAxis; 058 returnDimension[1] = yAxis; 059 returnDimension[2] = zAxis; 060 061 return returnDimension; 062 } 063 064 protected ArrayList createOptionalMenu() { 065 if (menuList.size() > 0) return null; 066 067 menuList.clear(); 068 itemChangThread = new JMenuItem("Switch thread..."); 069 itemChangThread.setMnemonic(KeyEvent.VK_T); 070 itemChangThread.addActionListener(new ActionListener() { 071 public void actionPerformed(ActionEvent e) { 072 visualize(); 073 } 074 }); 075 076 menuList.add(itemChangThread); 077 return menuList; 078 } 079 080 public void preVisualize() { 081 super.preVisualize(); 082 image = null; 083 methodStacks = new HashMap(); 084 } 085 086 public void receiveElement(Element element) { 087 long threadId = zAxis.getField(element); 088 089 switchThread(threadId); 090 long x = xAxis.getField(element); 091 long y = yAxis.getField(element); 092 long z = element.isOptional() ? Integer.MAX_VALUE : Integer.MIN_VALUE; 093 094 ((StackHotspotPainter)painter).setStack(stack); 095 paint(x,y,z); 096 } 097 098 public void visualize() { 099 String selected = null; 100 if (imageMap.size() == 0 ) return; 101 while (selected==null) { 102 selected = td.showDialog(); 103 if (selected != null) { 104 image = (AutoImage)imageMap.get(new Long(selected.substring(7,selected.length()))); 105 selected = null; 106 break; 107 } 108 } 109 super.visualize(); 110 } 111 112 protected void switchThread(long threadId) { 113 if (currentThread != threadId) { 114 stack = (Stack)methodStacks.get(new Long(threadId)); 115 if (stack == null) { 116 stack = new Stack(); 117 methodStacks.put(new Long(threadId),stack); 118 } 119 super.switchThread(threadId); 120 } 121 } 122 123 public Object clone() { 124 StackHotspotViz o = (StackHotspotViz)super.clone(); 125 o.createOptionalMenu(); 126 o.dataFilterName = new String[dataFilterName.length]; 127 for (int i=0; i<dataFilterName.length; i++) 128 o.dataFilterName[i] = dataFilterName[i]; 129 if (methodStacks == null) { 130 o.methodStacks = (HashMap)methodStacks.clone(); 131 Iterator it = methodStacks.keySet().iterator(); 132 while(it.hasNext()) { 133 Object key = it.next(); 134 o.methodStacks.put(key, methodStacks.get(key)); 135 } 136 } 137 o.td = new ThreadChooser(o.imageMap,false); 138 o.stack = (Stack)stack.clone(); 139 o.menuList.clear(); 140 return o; 141 } 142 }