1 7 package org.jahia.sqlprofiler.gui; 8 9 import java.text.DateFormat ; 10 import java.util.ArrayList ; 11 import java.util.Comparator ; 12 import java.util.Date ; 13 import java.util.Iterator ; 14 import java.util.List ; 15 import java.util.SortedSet ; 16 import java.util.TreeSet ; 17 import javax.swing.table.AbstractTableModel ; 18 import org.apache.log4j.Priority; 19 import org.apache.log4j.Category; 20 import org.jahia.sqlprofiler.QueryStatistics; 21 import java.util.StringTokenizer ; 22 import java.util.NoSuchElementException ; 23 import org.jahia.sqlprofiler.QueryStatEntry; 24 import java.text.NumberFormat ; 25 import java.io.StringWriter ; 26 import java.io.PrintWriter ; 27 import org.jahia.sqlprofiler.QueryEntry; 28 import java.util.Set ; 29 import java.io.FileWriter ; 30 import java.util.*; 31 import java.io.IOException ; 32 import java.text.SimpleDateFormat ; 33 34 40 class LoggerTableModel extends AbstractTableModel { 41 42 43 private static final Category LOG = 44 Category.getInstance(LoggerTableModel.class); 45 46 47 private static final String [] COL_NAMES = { 48 "Time", "Priority", "Trace", "Category", "NDC", "Message"}; 49 50 51 private static final EventDetails[] EMPTY_LIST = new EventDetails[] {}; 52 53 54 private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat ("yyyy.MM.dd hh:mm:ss.SSS"); 55 56 57 private final Object mLock = new Object (); 58 59 private final SortedSet mAllEvents = new TreeSet (MY_COMP); 60 61 private EventDetails[] mFilteredEvents = EMPTY_LIST; 62 63 private final List mPendingEvents = new ArrayList (); 64 65 private boolean mPaused = false; 66 67 68 private String mThreadFilter = ""; 69 70 private String mMessageFilter = ""; 71 72 private String mNDCFilter = ""; 73 74 private String mCategoryFilter = ""; 75 76 private Priority mPriorityFilter = Priority.DEBUG; 77 78 private ProfileStatementTableModel profileStatementModel = null; 79 80 private QueryCountChartModel queryCountChartModel = null; 81 private QueryTrafficChartModel queryTrafficChartModel = null; 82 83 84 private static final Comparator MY_COMP = new Comparator () { 85 86 public int compare(Object aObj1, Object aObj2) { 87 if ( (aObj1 == null) && (aObj2 == null)) { 88 return 0; } else if (aObj1 == null) { 90 return -1; } else if (aObj2 == null) { 92 return 1; } 94 95 final EventDetails le1 = (EventDetails) aObj1; 97 final EventDetails le2 = (EventDetails) aObj2; 98 99 if (le1.getTimeStamp() < le2.getTimeStamp()) { 100 return 1; 101 } 102 return -1; 104 } 105 }; 106 107 111 private class Processor 112 implements Runnable { 113 114 public void run() { 115 while (true) { 116 try { 117 Thread.sleep(1000); 118 } catch (InterruptedException e) { 119 } 121 122 synchronized (mLock) { 123 if (mPaused) { 124 continue; 125 } 126 127 boolean toHead = true; boolean needUpdate = false; 129 boolean needUpdateProfiler = false; 130 final Iterator it = mPendingEvents.iterator(); 131 while (it.hasNext()) { 132 final EventDetails event = (EventDetails) it.next(); 133 mAllEvents.add(event); 134 if (event.getCategoryName().equals("p6spy")) { 135 needUpdateProfiler = true; 136 if (profileStatementModel != null) { 137 profileStatementModel.processP6Event(event.getMessage()); 138 } 139 } 140 toHead = toHead && (event == mAllEvents.first()); 141 needUpdate = needUpdate || matchFilter(event); 142 } 143 if (queryCountChartModel != null) { 144 queryCountChartModel.update(); 145 } 146 if (queryTrafficChartModel != null) { 147 queryTrafficChartModel.update(); 148 } 149 if ((profileStatementModel != null) && (needUpdateProfiler)) { 150 profileStatementModel.sortAndUpdateTable(); 151 profileStatementModel.updateQueryStatsDisplay(); 152 } 153 mPendingEvents.clear(); 154 155 if (needUpdate) { 156 updateFilteredEvents(toHead); 157 } 158 } 159 } 160 161 } 162 } 163 164 165 166 170 LoggerTableModel() { 171 final Thread t = new Thread (new Processor()); 172 t.setDaemon(true); 173 t.start(); 174 } 175 176 180 181 public int getRowCount() { 182 synchronized (mLock) { 183 return mFilteredEvents.length; 184 } 185 } 186 187 188 public int getColumnCount() { 189 return COL_NAMES.length; 191 } 192 193 194 public String getColumnName(int aCol) { 195 return COL_NAMES[aCol]; 197 } 198 199 200 public Class getColumnClass(int aCol) { 201 return (aCol == 2) ? Boolean .class : Object .class; 203 } 204 205 206 public Object getValueAt(int aRow, int aCol) { 207 synchronized (mLock) { 208 final EventDetails event = mFilteredEvents[aRow]; 209 210 if (aCol == 0) { 211 return DATE_FORMATTER.format(new Date (event.getTimeStamp())); 212 } else if (aCol == 1) { 213 return event.getPriority(); 214 } else if (aCol == 2) { 215 return (event.getThrowableStrRep() == null) 216 ? Boolean.FALSE : Boolean.TRUE; 217 } else if (aCol == 3) { 218 return event.getCategoryName(); 219 } else if (aCol == 4) { 220 return event.getNDC(); 221 } 222 return event.getMessage(); 223 } 224 } 225 226 230 236 public void setPriorityFilter(Priority aPriority) { 237 synchronized (mLock) { 238 mPriorityFilter = aPriority; 239 updateFilteredEvents(false); 240 } 241 } 242 243 248 public void setThreadFilter(String aStr) { 249 synchronized (mLock) { 250 mThreadFilter = aStr.trim(); 251 updateFilteredEvents(false); 252 } 253 } 254 255 260 public void setMessageFilter(String aStr) { 261 synchronized (mLock) { 262 mMessageFilter = aStr.trim(); 263 updateFilteredEvents(false); 264 } 265 } 266 267 272 public void setNDCFilter(String aStr) { 273 synchronized (mLock) { 274 mNDCFilter = aStr.trim(); 275 updateFilteredEvents(false); 276 } 277 } 278 279 284 public void setCategoryFilter(String aStr) { 285 synchronized (mLock) { 286 mCategoryFilter = aStr.trim(); 287 updateFilteredEvents(false); 288 } 289 } 290 291 296 public void addEvent(EventDetails aEvent) { 297 synchronized (mLock) { 298 mPendingEvents.add(aEvent); 299 } 300 } 301 302 305 public void clear() { 306 synchronized (mLock) { 307 mAllEvents.clear(); 308 mFilteredEvents = new EventDetails[0]; 309 mPendingEvents.clear(); 310 if (profileStatementModel != null) { 311 profileStatementModel.clear(); 312 profileStatementModel.fireTableDataChanged(); 313 } 314 fireTableDataChanged(); 315 } 316 } 317 318 319 public void toggle() { 320 synchronized (mLock) { 321 mPaused = !mPaused; 322 if (mPaused) { 323 if (profileStatementModel != null) { 324 profileStatementModel.displayOccurenceStats(false); 325 } 326 } 327 } 328 } 329 330 331 public boolean isPaused() { 332 synchronized (mLock) { 333 return mPaused; 334 } 335 } 336 337 343 public EventDetails getEventDetails(int aRow) { 344 synchronized (mLock) { 345 return mFilteredEvents[aRow]; 346 } 347 } 348 349 public void setProfileStatementModel(ProfileStatementTableModel profileStatementModel) { 350 this.profileStatementModel = profileStatementModel; 351 } 352 353 public void setQueryCountChartModel(QueryCountChartModel queryCountChartModel) { 354 this.queryCountChartModel = queryCountChartModel; 355 } 356 357 public void setQueryTrafficChartModel(QueryTrafficChartModel queryTrafficChartModel) { 358 this.queryTrafficChartModel = queryTrafficChartModel; 359 } 360 361 365 371 private void updateFilteredEvents(boolean aInsertedToFront) { 372 final long start = System.currentTimeMillis(); 373 final List filtered = new ArrayList (); 374 final int size = mAllEvents.size(); 375 final Iterator allEventIter = mAllEvents.iterator(); 376 377 while (allEventIter.hasNext()) { 378 final EventDetails event = (EventDetails) allEventIter.next(); 379 if (matchFilter(event)) { 380 filtered.add(event); 381 } 382 } 383 384 final EventDetails lastFirst = (mFilteredEvents.length == 0) 385 ? null 386 : mFilteredEvents[0]; 387 mFilteredEvents = (EventDetails[]) filtered.toArray(EMPTY_LIST); 388 389 if (aInsertedToFront && (lastFirst != null)) { 390 final int index = filtered.indexOf(lastFirst); 391 if (index < 1) { 392 LOG.warn("In strange state"); 393 fireTableDataChanged(); 394 } else { 395 fireTableRowsInserted(0, index - 1); 396 } 397 } else { 398 fireTableDataChanged(); 399 } 400 401 final long end = System.currentTimeMillis(); 402 LOG.debug("Total time [ms]: " + (end - start) 403 + " in update, size: " + size); 404 } 405 406 412 private boolean matchFilter(EventDetails aEvent) { 413 if (aEvent.getPriority().isGreaterOrEqual(mPriorityFilter) && 414 (aEvent.getThreadName().indexOf(mThreadFilter) >= 0) && 415 (aEvent.getCategoryName().indexOf(mCategoryFilter) >= 0) && 416 ( (mNDCFilter.length() == 0) || 417 ( (aEvent.getNDC() != null) && 418 (aEvent.getNDC().indexOf(mNDCFilter) >= 0)))) { 419 final String rm = aEvent.getMessage(); 420 if (rm == null) { 421 return (mMessageFilter.length() == 0); 423 } else { 424 return (rm.indexOf(mMessageFilter) >= 0); 425 } 426 } 427 428 return false; } 430 431 432 } | Popular Tags |