/* * To change this template, choose Tools | Templates * and open the template in the editor. */ /* * GlugMainJFrame.java * * Created on 26-Feb-2009, 03:18:40 */ package glug.gui; import gchisto.gctrace.GCTrace; import gchisto.gctracegenerator.NopGCTraceGeneratorListener; import gchisto.gctracegenerator.file.FileGCTrace; import gchisto.gctracegenerator.file.hotspot.GCLogFileReader; import glug.groovy.ParserDefLoader; import glug.gui.gc.GCTraceView; import glug.gui.model.LogarithmicBoundedRange; import glug.gui.timebar.TimelineDateTimeComponent; import glug.gui.timelinecursor.TimelineCursor; import glug.gui.zoom.TimelineViewport; import glug.gui.zoom.ViewPreservingZoomer; import glug.gui.zoom.ZoomFactorSlideUpdater; import glug.gui.zoom.ZoomFocusFinder; import glug.model.ThreadedSystem; import glug.model.time.LogInterval; import glug.parser.LogLoader; import glug.parser.LogLoaderFactory; import glug.parser.logmessages.LogMessageParserRegistry; import groovy.lang.GroovyCodeSource; import org.joda.time.DateTimeZone; import org.joda.time.Duration; import org.joda.time.Instant; import org.joda.time.Interval; import org.joda.time.format.PeriodFormat; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.text.NumberFormat; import java.util.List; import java.util.Map; import static glug.parser.logmessages.CompletedDatabaseQueryParser.DATABASE_QUERY; import static glug.parser.logmessages.CompletedPageRequestParser.PAGE_REQUEST; import static javax.swing.JFileChooser.APPROVE_OPTION; import static javax.swing.SwingUtilities.invokeLater; /** * Mostly auto-generated by... NETBEANS! Arrr! */ public class MainFrame extends javax.swing.JFrame { private static final long serialVersionUID = 1L; final ThreadedSystem threadedSystem = new ThreadedSystem(); UITimeScale uiTimeScale = new UITimeScale(); final ThreadedSystemViewComponent threadedSystemViewPanel; private ViewPreservingZoomer viewPreservingZoomer; /** Creates new form GlugMainJFrame */ @SuppressWarnings("serial") public MainFrame() { initComponents(); KeystrokeSupplementor keystrokeSupplementor = new KeystrokeSupplementor(); keystrokeSupplementor.hackCtrlPlus(zoomInMenuItem); keystrokeSupplementor.hackCtrlMinus(zoomOutMenuItem); timelineCursor = new TimelineCursor(); threadScale = new UIThreadScale(); threadedSystemViewPanel = new ThreadedSystemViewComponent(uiTimeScale, threadScale, threadedSystem, timelineCursor); timelineCursor.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { LogInterval selectedInterval = timelineCursor.getSelectedInterval(); String text = null; if (selectedInterval!=null) { text = selectedInterval.toJodaInterval().toPeriod().toString(PeriodFormat.getDefault()); Map<Object, Integer> occurences = threadedSystem.countOccurencesDuring(selectedInterval,"DB Query", "Page Request"); if (occurences.containsKey(DATABASE_QUERY) && occurences.containsKey(PAGE_REQUEST)) { float dbQueries = occurences.get(DATABASE_QUERY); int pageRequests = occurences.get(PAGE_REQUEST); float ratio = dbQueries/pageRequests; NumberFormat instance = NumberFormat.getInstance(); instance.setMinimumFractionDigits(2); instance.setMaximumFractionDigits(2); text=text+" " + instance.format(ratio)+" DB calls/Page req"; } } selectedRegionLabel.setText(text); } }); innerPanel = new JPanel(); innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.Y_AXIS)); // innerPanel.add(threadedSystemViewPanel); // uiTimeScale.addChangeListener(new PropertyChangeListener() { // @Override // public void propertyChange(PropertyChangeEvent evt) { // innerPanel.setSize(uiTimeScale.fullModelToViewLength(),400); // } // }); timelineScrollPane.getViewport().add(threadedSystemViewPanel); uiTimeScale.setFullInterval(new Interval(new Instant(), new Duration(1000000))); timelineDateTimeComponent = new TimelineDateTimeComponent(uiTimeScale); timelineDateTimeComponent.setTimeZone(DateTimeZone.forID("Europe/London")); timelineScrollPane.setColumnHeaderView(timelineDateTimeComponent); timelineScrollPane.validate(); logarithmicBoundedRange = new LogarithmicBoundedRange(timeMagnificationSlider.getModel()); timelineViewport = new TimelineViewport(uiTimeScale, timelineScrollPane.getViewport()); viewPreservingZoomer = new ViewPreservingZoomer(timelineViewport, new ZoomFocusFinder(timelineCursor, timelineScrollPane.getViewport(), uiTimeScale), logarithmicBoundedRange); zoomFactorSlideUpdater = new ZoomFactorSlideUpdater(uiTimeScale, logarithmicBoundedRange, timelineScrollPane.getViewport()); uiTimeScale.setMillisecondsPerPixel(1000); setTransferHandler(new FileImportDragAndDropTransferHandler() { @Override public void load(List<File> files) { for (File file : files) { loadFile(file); } } }); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" // <editor-fold defaultstate="collapsed" // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jFileChooser1 = new javax.swing.JFileChooser(); timeMagnificationSlider = new javax.swing.JSlider(); timelineScrollPane = new javax.swing.JScrollPane(); selectedRegionLabel = new javax.swing.JLabel(); menuBar = new javax.swing.JMenuBar(); fileMenu = new javax.swing.JMenu(); openFileMenuItem = new javax.swing.JMenuItem(); exitMenuItem = new javax.swing.JMenuItem(); viewMenu = new javax.swing.JMenu(); zoomToSelectionMenuItem = new javax.swing.JMenuItem(); zoomInMenuItem = new javax.swing.JMenuItem(); zoomOutMenuItem = new javax.swing.JMenuItem(); fitInWindowMenuItem = new javax.swing.JMenuItem(); selectVisibleMenuItem = new javax.swing.JMenuItem(); helpMenu = new javax.swing.JMenu(); aboutBoxMenuItem = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("Glug"); timeMagnificationSlider.setPaintTicks(true); timeMagnificationSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { timeMagnificationSliderStateChanged(evt); } }); fileMenu.setMnemonic('F'); fileMenu.setText("File"); openFileMenuItem.setMnemonic('O'); openFileMenuItem.setText("Open File..."); openFileMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { openFileMenuItemActionPerformed(evt); } }); fileMenu.add(openFileMenuItem); exitMenuItem.setMnemonic('X'); exitMenuItem.setText("Exit"); exitMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { exitMenuItemActionPerformed(evt); } }); fileMenu.add(exitMenuItem); menuBar.add(fileMenu); viewMenu.setMnemonic('V'); viewMenu.setText("View"); zoomToSelectionMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_E, java.awt.event.InputEvent.CTRL_MASK)); zoomToSelectionMenuItem.setMnemonic('Z'); zoomToSelectionMenuItem.setText("Zoom to selection"); zoomToSelectionMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { zoomToSelectionMenuItemActionPerformed(evt); } }); viewMenu.add(zoomToSelectionMenuItem); zoomInMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_PLUS, java.awt.event.InputEvent.CTRL_MASK)); zoomInMenuItem.setMnemonic('I'); zoomInMenuItem.setText("Zoom In"); zoomInMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { zoomInMenuItemActionPerformed(evt); } }); viewMenu.add(zoomInMenuItem); zoomOutMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_MINUS, java.awt.event.InputEvent.CTRL_MASK)); zoomOutMenuItem.setMnemonic('O'); zoomOutMenuItem.setText("Zoom Out"); zoomOutMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { zoomOutMenuItemActionPerformed(evt); } }); viewMenu.add(zoomOutMenuItem); fitInWindowMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.CTRL_MASK)); fitInWindowMenuItem.setMnemonic('F'); fitInWindowMenuItem.setText("Fit in Window"); fitInWindowMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { fitInWindowMenuItemActionPerformed(evt); } }); viewMenu.add(fitInWindowMenuItem); selectVisibleMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_W, java.awt.event.InputEvent.CTRL_MASK)); selectVisibleMenuItem.setText("Select Visible"); selectVisibleMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { selectVisibleMenuItemActionPerformed(evt); } }); viewMenu.add(selectVisibleMenuItem); menuBar.add(viewMenu); helpMenu.setMnemonic('H'); helpMenu.setText("Help"); aboutBoxMenuItem.setMnemonic('A'); aboutBoxMenuItem.setText("About Glug"); aboutBoxMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { aboutBoxMenuItemActionPerformed(evt); } }); helpMenu.add(aboutBoxMenuItem); menuBar.add(helpMenu); setJMenuBar(menuBar); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addComponent(selectedRegionLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 340, Short.MAX_VALUE) .addComponent(timeMagnificationSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(timelineScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 552, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(selectedRegionLabel) .addComponent(timeMagnificationSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(timelineScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 368, Short.MAX_VALUE)) ); pack(); }// </editor-fold>//GEN-END:initComponents private void fitInWindowMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fitInWindowMenuItemActionPerformed fitWindowTo(uiTimeScale.getFullInterval()); }//GEN-LAST:event_fitInWindowMenuItemActionPerformed private void zoomOutMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zoomOutMenuItemActionPerformed viewPreservingZoomer.zoomPreservingViewLocation(uiTimeScale.getMillisecondsPerPixel() * 2); }//GEN-LAST:event_zoomOutMenuItemActionPerformed private void selectVisibleMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectVisibleMenuItemActionPerformed Interval visibleInterval = timelineViewport.getVisibleInterval(); timelineCursor.setSelectedInterval(new LogInterval(visibleInterval)); }//GEN-LAST:event_selectVisibleMenuItemActionPerformed private void zoomToSelectionMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_zoomToSelectionMenuItemActionPerformed LogInterval selectedInterval = timelineCursor.getSelectedInterval(); if (selectedInterval != null) { fitWindowTo(selectedInterval.toJodaInterval()); } }// GEN-LAST:event_zoomToSelectionMenuItemActionPerformed private void fitWindowTo(Interval interval) { uiTimeScale.setMillisecondsPerPixelToFit(interval, timelineScrollPane.getViewport().getExtentSize().width); timelineViewport.setViewPosition(interval.getStart().toInstant(), 0); } private void zoomInMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jMenuItem1ActionPerformed viewPreservingZoomer.zoomPreservingViewLocation(uiTimeScale.getMillisecondsPerPixel() / 2); }// GEN-LAST:event_jMenuItem1ActionPerformed private void timeMagnificationSliderStateChanged(javax.swing.event.ChangeEvent evt) {// GEN-FIRST:event_timeMagnificationSliderStateChanged viewPreservingZoomer.zoomPreservingViewLocation(logarithmicBoundedRange.getCurrentMillisecondsPerPixel()); }// GEN-LAST:event_timeMagnificationSliderStateChanged private void openFileMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_openFileMenuItemActionPerformed int returnVal = jFileChooser1.showOpenDialog(this); if (returnVal == APPROVE_OPTION) { loadFile(jFileChooser1.getSelectedFile()); } }// GEN-LAST:event_openFileMenuItemActionPerformed private void loadFile(File file) { System.out.println("You chose to open this file: " + file.getName()); if (file.getName().toLowerCase().contains("jvm")) { loadGarbageCollectionLogFile(file); } else { loadJavaProcessLogFile(file); } } private void loadJavaProcessLogFile(File file) { System.out.println("Loading Java process log..."); LogLoaderFactory logLoaderFactory = new LogLoaderFactory(); try { InputStream stream = ParserDefLoader.class.getResourceAsStream("DefaultParsers.groovy"); //System.out.println("Groovy resource at "+resource); LogMessageParserRegistry registry = new ParserDefLoader().load(new GroovyCodeSource(new InputStreamReader(stream),"foo","bar")); LogLoader logLoader = logLoaderFactory.createLoaderFor(file, threadedSystem, registry); new LogLoadingTask(logLoader, new DataLoadedUIUpdater( threadedSystem, uiTimeScale, threadScale, zoomFactorSlideUpdater),50000).execute(); } catch (Exception e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } private void loadGarbageCollectionLogFile(File file) { System.out.println("Loading Garbage Collection file..."); new FileGCTrace(file, new GCLogFileReader()).init(new NopGCTraceGeneratorListener() { @Override public void finished(final GCTrace gcTrace) { System.out.println("Finished loading Garbage Collection file"); invokeLater(new Runnable() { @Override public void run() { innerPanel.add(new GCTraceView(gcTrace, uiTimeScale, threadedSystem, timelineCursor)); } }); } }); } private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_exitMenuItemActionPerformed System.exit(0); }// GEN-LAST:event_exitMenuItemActionPerformed private void aboutBoxMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_aboutBoxMenuItemActionPerformed new AboutBox().setVisible(true); }// GEN-LAST:event_aboutBoxMenuItemActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JMenuItem aboutBoxMenuItem; private javax.swing.JMenuItem exitMenuItem; private javax.swing.JMenu fileMenu; private javax.swing.JMenuItem fitInWindowMenuItem; private javax.swing.JMenu helpMenu; private javax.swing.JFileChooser jFileChooser1; private javax.swing.JMenuBar menuBar; private javax.swing.JMenuItem openFileMenuItem; private javax.swing.JMenuItem selectVisibleMenuItem; private javax.swing.JLabel selectedRegionLabel; private javax.swing.JSlider timeMagnificationSlider; private javax.swing.JScrollPane timelineScrollPane; private javax.swing.JMenu viewMenu; private javax.swing.JMenuItem zoomInMenuItem; private javax.swing.JMenuItem zoomOutMenuItem; private javax.swing.JMenuItem zoomToSelectionMenuItem; // End of variables declaration//GEN-END:variables private LogarithmicBoundedRange logarithmicBoundedRange; private ZoomFactorSlideUpdater zoomFactorSlideUpdater; private TimelineDateTimeComponent timelineDateTimeComponent; private TimelineCursor timelineCursor; private JPanel innerPanel; private UIThreadScale threadScale; private TimelineViewport timelineViewport; }