1 8 package org.jahia.sqlprofiler.gui; 9 10 import javax.swing.table.*; 11 import java.util.*; 12 import java.text.*; 13 import java.awt.event.MouseAdapter ; 14 import java.awt.event.MouseEvent ; 15 import java.awt.event.InputEvent ; 16 import javax.swing.JTable ; 17 18 26 27 public class ProfileResultTableModel extends AbstractTableModel 28 implements Comparator { 29 30 private ArrayList profileResults = new ArrayList(); 31 protected int currCol = 0; 32 protected Vector ascendCol = new Vector(); protected Integer one = new Integer (1); 34 protected Integer minusOne = new Integer ( -1); 35 36 private static final String [] COLUMN_NAMES = { 37 "%", "Time[ms]", "Count", "Table(s)", "Column(s)"}; 38 39 public ProfileResultTableModel() { 40 for (int i=0; i < COLUMN_NAMES.length; i++) { 41 ascendCol.add(one); 42 } 43 } 44 45 public int getRowCount() { 46 return profileResults.size(); 47 } 48 49 public int getColumnCount() { 50 return COLUMN_NAMES.length; 51 } 52 53 public String getColumnName(int aCol) { 54 return COLUMN_NAMES[aCol]; 56 } 57 58 public Object getValueAt(int rowIndex, int columnIndex) { 59 ProfileReportResult curResult = (ProfileReportResult) profileResults. 60 get(rowIndex); 61 NumberFormat nf = NumberFormat.getInstance(); 62 nf.setMaximumFractionDigits(2); 63 Object result = null; 64 switch (columnIndex) { 65 case 0: 66 result = nf.format(curResult.getPercentage()); 67 break; 68 case 1: 69 result = new Long (curResult.getTotalElapsedTime()); 70 break; 71 case 2: 72 result = new Integer (curResult.getOccurences()); 73 break; 74 case 3: 75 StringBuffer resultBuf = new StringBuffer (); 76 Iterator tableNameIter = curResult.getTableNames().iterator(); 77 while (tableNameIter.hasNext()) { 78 String curTableName = (String ) tableNameIter.next(); 79 resultBuf.append(curTableName); 80 if (tableNameIter.hasNext()) { 81 resultBuf.append(","); 82 } 83 } 84 result = resultBuf.toString(); 85 break; 86 case 4: 87 StringBuffer resultBuf2 = new StringBuffer (); 88 Iterator columnNameIter = curResult.getColumnNames().iterator(); 89 while (columnNameIter.hasNext()) { 90 String curColumnName = (String ) columnNameIter.next(); 91 resultBuf2.append(curColumnName); 92 if (columnNameIter.hasNext()) { 93 resultBuf2.append(","); 94 } 95 } 96 result = resultBuf2.toString(); 97 break; 98 } 99 return result; 100 } 101 102 public void clear() { 103 profileResults.clear(); 104 currCol = 0; 105 fireTableDataChanged(); 106 } 107 108 public void addProfileReportResult(ProfileReportResult profileReportResult) { 109 profileResults.add(profileReportResult); 110 } 111 112 116 public int compare(Object v1, Object v2) { 117 118 121 int ascending = ( (Integer ) ascendCol.get(currCol)).intValue(); 122 if (v1 == null && v2 == null) { 123 return 0; 124 } else if (v2 == null) { return 1 * ascending; 126 } else if (v1 == null) { 127 return -1 * ascending; 128 } 129 130 ProfileReportResult left = (ProfileReportResult) v1; 131 ProfileReportResult right = (ProfileReportResult) v2; 132 133 Object o1 = null; 134 Object o2 = null; 135 switch (currCol) { 136 case 0: 137 o1 = new Double (left.getPercentage()); 138 o2 = new Double (right.getPercentage()); 139 break; 140 case 1: 141 o1 = new Long (left.getTotalElapsedTime()); 142 o2 = new Long (right.getTotalElapsedTime()); 143 break; 144 case 2: 145 o1 = new Integer (left.getOccurences()); 146 o2 = new Integer (right.getOccurences()); 147 break; 148 case 3: 149 o1 = left.getTableNames(); 150 o2 = right.getTableNames(); 151 break; 152 case 4: 153 o1 = left.getColumnNames(); 154 o2 = right.getColumnNames(); 155 break; 156 } 157 158 if (o1 == null && o2 == null) { 160 return 0; 161 } else if (o2 == null) { return 1 * ascending; 163 } else if (o1 == null) { 164 return -1 * ascending; 165 } 166 167 if (o1 instanceof Number && o2 instanceof Number ) { 168 Number n1 = (Number ) o1; 169 double d1 = n1.doubleValue(); 170 Number n2 = (Number ) o2; 171 double d2 = n2.doubleValue(); 172 173 if (d1 == d2) { 174 return 0; 175 } else if (d1 > d2) { 176 return 1 * ascending; 177 } else { 178 return -1 * ascending; 179 } 180 181 } else if (o1 instanceof Boolean && o2 instanceof Boolean ) { 182 Boolean bool1 = (Boolean ) o1; 183 boolean b1 = bool1.booleanValue(); 184 Boolean bool2 = (Boolean ) o2; 185 boolean b2 = bool2.booleanValue(); 186 187 if (b1 == b2) { 188 return 0; 189 } else if (b1) { 190 return 1 * ascending; 191 } else { 192 return -1 * ascending; 193 } 194 195 } else { 196 if (o1 instanceof Comparable && o2 instanceof Comparable ) { 198 Comparable c1 = (Comparable ) o1; 199 Comparable c2 = (Comparable ) o2; 201 try { 202 return c1.compareTo(c2) * ascending; 203 } catch (ClassCastException cce) { 204 } 206 } 207 208 String s1 = o1.toString(); 209 String s2 = o2.toString(); 210 return s1.compareTo(s2) * ascending; 211 } 212 } 213 214 219 public void sort() { 220 Collections.sort(profileResults, this); 221 Integer val = (Integer ) ascendCol.get(currCol); 222 ascendCol.remove(currCol); 223 if (val.equals(one)) ascendCol.add(currCol, minusOne); 225 else 226 ascendCol.add(currCol, one); 227 } 228 229 public void sortByColumn(int column) { 230 this.currCol = column; 231 sort(); 232 fireTableDataChanged(); 233 } 234 235 public void addMouseListenerToHeaderInTable(JTable table) { 238 final ProfileResultTableModel sorter = this; 239 final JTable tableView = table; 240 tableView.setColumnSelectionAllowed(false); 241 MouseAdapter listMouseListener = new MouseAdapter () { 242 public void mouseClicked(MouseEvent e) { 243 TableColumnModel columnModel = tableView.getColumnModel(); 244 int viewColumn = columnModel.getColumnIndexAtX(e.getX()); 245 int column = tableView.convertColumnIndexToModel(viewColumn); 246 if (e.getClickCount() == 1 && column != -1) { 247 int shiftPressed = e.getModifiers() & InputEvent.SHIFT_MASK; 248 boolean ascending = (shiftPressed == 0); 249 sorter.sortByColumn(column); 250 } 251 } 252 }; 253 JTableHeader th = tableView.getTableHeader(); 254 th.addMouseListener(listMouseListener); 255 } 256 257 } | Popular Tags |