You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by ps...@apache.org on 2008/01/18 07:11:21 UTC

svn commit: r613063 [2/2] - in /labs/pinpoint/trunk: ./ pinpoint-cli/ pinpoint-cli/src/main/java/org/apache/logging/pinpoint/ pinpoint-core/src/main/java/org/apache/logging/pinpoint/converter/ pinpoint-core/src/test/java/org/apache/logging/pinpoint/con...

Added: labs/pinpoint/trunk/pinpoint-swing/src/main/java/org/apache/logging/pinpoint/swing/EventContextViewModel.java
URL: http://svn.apache.org/viewvc/labs/pinpoint/trunk/pinpoint-swing/src/main/java/org/apache/logging/pinpoint/swing/EventContextViewModel.java?rev=613063&view=auto
==============================================================================
--- labs/pinpoint/trunk/pinpoint-swing/src/main/java/org/apache/logging/pinpoint/swing/EventContextViewModel.java (added)
+++ labs/pinpoint/trunk/pinpoint-swing/src/main/java/org/apache/logging/pinpoint/swing/EventContextViewModel.java Thu Jan 17 22:11:18 2008
@@ -0,0 +1,131 @@
+package org.apache.logging.pinpoint.swing;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+import org.apache.log4j.Logger;
+import org.apache.logging.pinpoint.concurrent.BaseNameDaemonThreadFatory;
+import org.apache.logging.pinpoint.search.PinpointConnection;
+import org.apache.logging.pinpoint.search.PinpointSearchUtils;
+import org.apache.logging.pinpoint.utils.PinpointUtils;
+
+public class EventContextViewModel {
+
+    private static final Logger LOG = PinpointUtils
+            .getLogger(EventContextViewModel.class);
+
+    private final PinpointConnection connection;
+
+    private String contextEventKey;
+    private int contextTimeRangeWindow;
+    private boolean showAllThreads = false;
+
+    private final PropertyChangeSupport support = new PropertyChangeSupport(
+            this);
+
+    private List<String> contextEventKeys = Collections.emptyList();
+
+    private Executor executor = Executors.newFixedThreadPool(2,
+            new BaseNameDaemonThreadFatory(this.getClass()));
+
+    private PinpointSearchUtils searchUtils;
+
+    private PropertyChangeListener rescanListener = new PropertyChangeListener() {
+
+        public void propertyChange(PropertyChangeEvent evt) {
+            rescanContext();
+        }
+
+    };
+
+    public EventContextViewModel(PinpointConnection connection) {
+        this.connection = connection;
+        this.searchUtils = new PinpointSearchUtils(connection);
+        addPropertyChangeListener("contextEventKey", rescanListener);
+        addPropertyChangeListener("showAllThreads", rescanListener);
+    }
+
+    private void rescanContext() {
+        executor.execute(new Runnable() {
+
+            public void run() {
+                //                TODO use configured time range window
+                try {
+                    if (contextEventKey == null) {
+                        setContextEventKeys(Collections.<String> emptyList());
+                    } else {
+
+                        setContextEventKeys(searchUtils.showEventInContext(
+                                contextEventKey, isShowAllThreads()));
+                    }
+
+                } catch (Exception e) {
+                    LOG.error("Failed to rescan Context events", e);
+                }
+            }
+
+        });
+
+    }
+
+    public final List<String> getContextEventKeys() {
+        return contextEventKeys;
+    }
+
+    public final void setContextEventKeys(List<String> contextEventKeys) {
+        List<String> oldValue = this.contextEventKeys;
+        this.contextEventKeys = contextEventKeys;
+        support.firePropertyChange("contextEventKeys", oldValue,
+                this.contextEventKeys);
+    }
+
+    public void addPropertyChangeListener(String propertyName,
+            PropertyChangeListener listener) {
+        support.addPropertyChangeListener(propertyName, listener);
+    }
+
+    public final String getContextEventKey() {
+        return contextEventKey;
+    }
+
+    public final int getContextTimeRangeWindow() {
+        return contextTimeRangeWindow;
+    }
+
+    public final void setContextTimeRangeWindow(int contextTimeRangeWindow) {
+        int oldValue = this.contextTimeRangeWindow;
+        this.contextTimeRangeWindow = contextTimeRangeWindow;
+        support.firePropertyChange("contexTimeRangeWindow", oldValue,
+                this.contextTimeRangeWindow);
+    }
+
+    public final boolean isShowAllThreads() {
+        return showAllThreads;
+    }
+
+    public final void setShowAllThreads(boolean showAllThreads) {
+        boolean oldValue = this.showAllThreads;
+        this.showAllThreads = showAllThreads;
+        support.firePropertyChange("showAllThreads", oldValue,
+                this.showAllThreads);
+    }
+
+    public final void setContextEventKey(String contextEventKey) {
+        String oldValue = this.contextEventKey;
+        this.contextEventKey = contextEventKey;
+        support.firePropertyChange("contextEventKey", oldValue,
+                this.contextEventKey);
+    }
+
+    /**
+     * Effectively means there is no selected context event
+     */
+    public void clear() {
+        setContextEventKey(null);
+    }
+}

Added: labs/pinpoint/trunk/pinpoint-swing/src/main/java/org/apache/logging/pinpoint/swing/LoggingEventTableModel.java
URL: http://svn.apache.org/viewvc/labs/pinpoint/trunk/pinpoint-swing/src/main/java/org/apache/logging/pinpoint/swing/LoggingEventTableModel.java?rev=613063&view=auto
==============================================================================
--- labs/pinpoint/trunk/pinpoint-swing/src/main/java/org/apache/logging/pinpoint/swing/LoggingEventTableModel.java (added)
+++ labs/pinpoint/trunk/pinpoint-swing/src/main/java/org/apache/logging/pinpoint/swing/LoggingEventTableModel.java Thu Jan 17 22:11:18 2008
@@ -0,0 +1,103 @@
+package org.apache.logging.pinpoint.swing;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+import javax.swing.table.AbstractTableModel;
+
+import org.apache.log4j.spi.LoggingEvent;
+import org.apache.logging.pinpoint.search.PinpointConnection;
+
+public class LoggingEventTableModel extends AbstractTableModel {
+
+    private static final long serialVersionUID = 1L;
+
+    private final List<String> eventKeys;
+    private final PinpointConnection connection;
+    private final LoggingEvent[] events;
+
+    public LoggingEventTableModel(List<String> eventKeys,
+            PinpointConnection connection) {
+        this.eventKeys = eventKeys;
+        this.connection = connection;
+        this.events = new LoggingEvent[eventKeys.size()];
+    }
+
+    public int getColumnCount() {
+
+        //        TODO  depends on how many Property values there are in a set of events.
+        return 5;
+    }
+
+    public int getRowCount() {
+        return eventKeys.size();
+    }
+
+    public LoggingEvent lookupEventAtRow(int rowIndex) {
+        if (events[rowIndex] == null) {
+            events[rowIndex] = connection.details(
+                    Collections.singletonList(eventKeys.get(rowIndex))).get(0);
+            //            TODO should we now 'observe' this event and potentially adjust the # columns this model now knows about?
+        }
+        LoggingEvent e = events[rowIndex];
+        return e;
+
+    }
+
+    public String lookupEventKeyAtRow(int rowIndex) {
+
+        return eventKeys.get(rowIndex);
+    }
+
+    @Override
+    public Class<?> getColumnClass(int columnIndex) {
+        switch (columnIndex) {
+        case 0:
+            return Date.class;
+
+        default:
+            return super.getColumnClass(columnIndex);
+        }
+    }
+
+    public Object getValueAt(int rowIndex, int columnIndex) {
+        LoggingEvent e = lookupEventAtRow(rowIndex);
+        switch (columnIndex) {
+        case 0:
+            return new Date(e.getTimeStamp());
+        case 1:
+            return e.getLevel();
+        case 2:
+            return e.getThreadName();
+        case 3:
+            return e.getLoggerName();
+        case 4:
+            return e.getMessage();
+
+        default:
+            return "<Unknown: " + columnIndex + ">";
+        }
+    }
+
+    @Override
+    public String getColumnName(int column) {
+        switch (column) {
+        case 0:
+            return "Timestamp";
+        case 1:
+            return "Level";
+        case 2:
+            return "Thread";
+        case 3:
+            return "Logger";
+        case 4:
+            return "Message";
+
+        default:
+            throw new RuntimeException("Unexpeted column index: " + column);
+
+        }
+    }
+
+}

Added: labs/pinpoint/trunk/pinpoint-swing/src/main/java/org/apache/logging/pinpoint/swing/PinpointConnectionSearchPanel.java
URL: http://svn.apache.org/viewvc/labs/pinpoint/trunk/pinpoint-swing/src/main/java/org/apache/logging/pinpoint/swing/PinpointConnectionSearchPanel.java?rev=613063&view=auto
==============================================================================
--- labs/pinpoint/trunk/pinpoint-swing/src/main/java/org/apache/logging/pinpoint/swing/PinpointConnectionSearchPanel.java (added)
+++ labs/pinpoint/trunk/pinpoint-swing/src/main/java/org/apache/logging/pinpoint/swing/PinpointConnectionSearchPanel.java Thu Jan 17 22:11:18 2008
@@ -0,0 +1,211 @@
+package org.apache.logging.pinpoint.swing;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+import javax.swing.AbstractAction;
+import javax.swing.BorderFactory;
+import javax.swing.JCheckBox;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+import javax.swing.JToolBar;
+import javax.swing.ListSelectionModel;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.table.DefaultTableCellRenderer;
+
+import org.apache.log4j.spi.LoggingEvent;
+import org.apache.logging.pinpoint.concurrent.BaseNameDaemonThreadFatory;
+import org.apache.logging.pinpoint.search.PinpointConnection;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.queryParser.QueryParser;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+
+public class PinpointConnectionSearchPanel extends JPanel {
+
+    private final JSplitPane splitPane = new JSplitPane(
+            JSplitPane.VERTICAL_SPLIT);
+    private JTextField searchField = new JTextField();
+    private JTable resultTable = new JTable();
+    private JTable contextTable = new JTable();
+    private QueryParser parser = new QueryParser("message",
+            new StandardAnalyzer());
+
+    private EventContextViewModel eventContextViewModel;
+
+    private Executor executor = Executors.newFixedThreadPool(6,
+            new BaseNameDaemonThreadFatory(this.getClass()));
+
+    private final PinpointConnection connection;
+
+    public PinpointConnectionSearchPanel(PinpointConnection connection) {
+        this.connection = connection;
+        eventContextViewModel = new EventContextViewModel(connection);
+        initComponents();
+
+    }
+
+    private void initComponents() {
+        setLayout(new BorderLayout());
+
+        JScrollPane resultScrollPane = new JScrollPane(resultTable);
+        splitPane.setTopComponent(resultScrollPane);
+
+        JPanel contextPanel = new JPanel(new BorderLayout());
+        JScrollPane contextPanelScrollPane = new JScrollPane(contextTable);
+        contextPanel.add(contextPanelScrollPane, BorderLayout.CENTER);
+        JToolBar toolbar = new JToolBar();
+
+        AbstractAction action = new AbstractAction("Show All Threads") {
+
+            public void actionPerformed(ActionEvent e) {
+                eventContextViewModel.setShowAllThreads(!eventContextViewModel
+                        .isShowAllThreads());
+
+            }
+        };
+
+        final JCheckBox checkBox = new JCheckBox(action);
+        checkBox.setSelected(eventContextViewModel.isShowAllThreads());
+        eventContextViewModel.addPropertyChangeListener("showAllThreads",
+                new PropertyChangeListener() {
+
+                    public void propertyChange(PropertyChangeEvent evt) {
+                        checkBox.setSelected(eventContextViewModel
+                                .isShowAllThreads());
+                    }
+                });
+
+        toolbar.add(checkBox);
+        toolbar.setFloatable(false);
+
+        contextPanel.add(toolbar, BorderLayout.NORTH);
+
+        splitPane.setBottomComponent(contextPanel);
+
+        add(splitPane, BorderLayout.CENTER);
+
+        // -------------------------
+        // BEGIN -- Search Query Panel
+        // -------------------------
+        JPanel searchQueryPanel = new JPanel(new BorderLayout());
+        searchQueryPanel.add(searchField, BorderLayout.CENTER);
+
+        searchQueryPanel.setBorder(BorderFactory.createTitledBorder(
+                BorderFactory.createEtchedBorder(), "Search Query"));
+
+        add(searchQueryPanel, BorderLayout.NORTH);
+
+        searchField.addKeyListener(new KeyAdapter() {
+
+            public void keyPressed(KeyEvent e) {
+                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
+                    String searchText = searchField.getText();
+                    search(searchText);
+                }
+            }
+        });
+        // -------------------------
+        // END -- Search Query Panel
+        // -------------------------
+
+        resultTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+        resultTable.getSelectionModel().addListSelectionListener(
+                new ListSelectionListener() {
+
+                    public void valueChanged(ListSelectionEvent e) {
+                        if (resultTable.getSelectedRow() < 0) {
+                            eventContextViewModel.clear();
+                            return;
+                        }
+                        eventContextViewModel
+                                .setContextEventKey(lookupEventKeyAtRow(
+                                        resultTable, resultTable
+                                                .getSelectedRow()));
+                    }
+                });
+
+        eventContextViewModel.addPropertyChangeListener("contextEventKeys",
+                new PropertyChangeListener() {
+
+                    public void propertyChange(PropertyChangeEvent evt) {
+                        contextTable.setModel(new LoggingEventTableModel(
+                                eventContextViewModel.getContextEventKeys(),
+                                connection));
+                    }
+                });
+
+        configureTableLaF(resultTable);
+        configureTableLaF(contextTable);
+
+        //        resultScrollPane.setBorder(BorderFactory.createTitledBorder(
+        //                BorderFactory.createEtchedBorder(), "Search Results"));
+        //
+        //        contextPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory
+        //                .createEtchedBorder(), "Event Context"));
+
+    }
+
+    private void configureTableLaF(JTable table) {
+
+        table.setShowVerticalLines(true);
+        table.setShowHorizontalLines(true);
+        table.setShowGrid(true);
+        table.setDefaultRenderer(Date.class, new DefaultTableCellRenderer() {
+            DateTimeFormatter formatter = DateTimeFormat
+                    .forPattern("hh:MM:sss");
+
+            public Component getTableCellRendererComponent(JTable table,
+                    Object value, boolean isSelected, boolean hasFocus,
+                    int row, int column) {
+
+                value = formatter.print(((Date) value).getTime());
+
+                return super.getTableCellRendererComponent(table, value,
+                        isSelected, hasFocus, row, column);
+            }
+        });
+    }
+
+    private void search(final String searchText) {
+        executor.execute(new Runnable() {
+
+            public void run() {
+                //                TODO update a status bar?  Cursor change?
+                try {
+                    List<String> results = connection.search(parser
+                            .parse(searchText));
+                    resultTable.setModel(new LoggingEventTableModel(results,
+                            connection));
+                } catch (Exception e) {
+                    throw new RuntimeException("Failed to search:'" +
+                            searchText + "'", e);
+                }
+            }
+        });
+
+    }
+
+    private LoggingEvent lookupEventAtRow(JTable table, int rowIndex) {
+        return ((LoggingEventTableModel) table.getModel())
+                .lookupEventAtRow(rowIndex);
+    }
+
+    private String lookupEventKeyAtRow(JTable table, int rowIndex) {
+        return ((LoggingEventTableModel) table.getModel())
+                .lookupEventKeyAtRow(rowIndex);
+    }
+}

Added: labs/pinpoint/trunk/pinpoint-swing/src/main/java/org/apache/logging/pinpoint/swing/Startup.java
URL: http://svn.apache.org/viewvc/labs/pinpoint/trunk/pinpoint-swing/src/main/java/org/apache/logging/pinpoint/swing/Startup.java?rev=613063&view=auto
==============================================================================
--- labs/pinpoint/trunk/pinpoint-swing/src/main/java/org/apache/logging/pinpoint/swing/Startup.java (added)
+++ labs/pinpoint/trunk/pinpoint-swing/src/main/java/org/apache/logging/pinpoint/swing/Startup.java Thu Jan 17 22:11:18 2008
@@ -0,0 +1,31 @@
+package org.apache.logging.pinpoint.swing;
+
+import java.io.IOException;
+
+import javax.swing.JFrame;
+
+import org.apache.logging.pinpoint.PinpointHome;
+import org.apache.logging.pinpoint.search.LocalConnectionFactory;
+import org.apache.logging.pinpoint.search.PinpointConnection;
+import org.apache.lucene.queryParser.ParseException;
+
+public class Startup {
+
+    public static void main(String[] args) throws IOException, ParseException {
+
+        LocalConnectionFactory connectionFactory = new LocalConnectionFactory(
+                new PinpointHome());
+        PinpointConnection connection = connectionFactory.connect("2007-10-19");
+
+        JFrame frame = new JFrame();
+
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+        frame.getContentPane().add(
+                new PinpointConnectionSearchPanel(connection));
+
+        frame.pack();
+
+        frame.setVisible(true);
+    }
+}

Modified: labs/pinpoint/trunk/pinpoint-web/src/main/java/org/apache/logging/pinpoint/web/PinpointSearchResultContextViewController.java
URL: http://svn.apache.org/viewvc/labs/pinpoint/trunk/pinpoint-web/src/main/java/org/apache/logging/pinpoint/web/PinpointSearchResultContextViewController.java?rev=613063&r1=613062&r2=613063&view=diff
==============================================================================
--- labs/pinpoint/trunk/pinpoint-web/src/main/java/org/apache/logging/pinpoint/web/PinpointSearchResultContextViewController.java (original)
+++ labs/pinpoint/trunk/pinpoint-web/src/main/java/org/apache/logging/pinpoint/web/PinpointSearchResultContextViewController.java Thu Jan 17 22:11:18 2008
@@ -8,11 +8,11 @@
 import org.apache.commons.lang.math.NumberUtils;
 import org.apache.log4j.spi.LoggingEvent;
 import org.apache.logging.pinpoint.PinpointContext;
+import org.apache.logging.pinpoint.search.LocalConnectionFactory;
+import org.apache.logging.pinpoint.search.PinpointConnection;
 import org.apache.logging.pinpoint.search.PinpointSearchResults;
 import org.apache.logging.pinpoint.search.PinpointSearchUtils;
-import org.apache.logging.pinpoint.search.PinpointSearcher;
 import org.apache.logging.pinpoint.search.PinpointSearcherCache;
-import org.apache.logging.pinpoint.store.EventStore;
 
 public class PinpointSearchResultContextViewController extends
         AbstractPinpointResultController {
@@ -20,6 +20,16 @@
     public static final String RESULT_ON_PAGE = "resultIndexOnPage";
 
     private PinpointSearcherCache searcherCache;
+    private LocalConnectionFactory connectionFactory;
+
+    public final LocalConnectionFactory getConnectionFactory() {
+        return connectionFactory;
+    }
+
+    public final void setConnectionFactory(
+            LocalConnectionFactory connectionFactory) {
+        this.connectionFactory = connectionFactory;
+    }
 
     public final PinpointSearcherCache getSearcherCache() {
         return searcherCache;
@@ -37,21 +47,19 @@
         PinpointSearchResults results = getResults(req);
 
         PinpointContext context = results.getContext();
-        EventStore eventStore = getEventStoreFactory()
-                .createEventStore(context);
-
-        PinpointSearcher searcher = getSearcherCache().getSearcher(context);
+        PinpointConnection connection = connectionFactory.connect(context);
 
         try {
-            PinpointSearchUtils utils = new PinpointSearchUtils(searcher,
-                    eventStore);
+            PinpointSearchUtils utils = new PinpointSearchUtils(
+                    connectionFactory.connect(context));
 
-            Iterable<LoggingEvent> eventsInContext = utils.showEventInContext(
-                    results, contextResultIndex);
+            Iterable<LoggingEvent> eventsInContext = connection.details(utils
+                    .showEventInContext(results.getPageResults().get(
+                            contextResultIndex), true));
 
         } finally {
             try {
-                eventStore.close();
+                connection.close();
             } catch (IOException e) {
                 throw new RuntimeException(
                         "Failed to close EventStore cleanly", e);

Modified: labs/pinpoint/trunk/pinpoint-web/src/main/webapp/WEB-INF/dispatcher-servlet.xml
URL: http://svn.apache.org/viewvc/labs/pinpoint/trunk/pinpoint-web/src/main/webapp/WEB-INF/dispatcher-servlet.xml?rev=613063&r1=613062&r2=613063&view=diff
==============================================================================
--- labs/pinpoint/trunk/pinpoint-web/src/main/webapp/WEB-INF/dispatcher-servlet.xml (original)
+++ labs/pinpoint/trunk/pinpoint-web/src/main/webapp/WEB-INF/dispatcher-servlet.xml Thu Jan 17 22:11:18 2008
@@ -42,6 +42,10 @@
 
 	<bean id="eventStoreFactory" class="org.apache.logging.pinpoint.store.SimpleEventStoreFactory" />
 	
+	<bean id="connectionFactory" class="org.apache.logging.pinpoint.search.LocalConnectionFactory">
+		<constructor-arg ref="pinpointHome" />
+	</bean>
+	
 	<bean id="resultNavigator" class="org.apache.logging.pinpoint.web.PinpointSearchResultsNavigator" >
 		<property name="eventStoreFactory" ref="eventStoreFactory" />
 	</bean>

Modified: labs/pinpoint/trunk/pom.xml
URL: http://svn.apache.org/viewvc/labs/pinpoint/trunk/pom.xml?rev=613063&r1=613062&r2=613063&view=diff
==============================================================================
--- labs/pinpoint/trunk/pom.xml (original)
+++ labs/pinpoint/trunk/pom.xml Thu Jan 17 22:11:18 2008
@@ -31,7 +31,7 @@
     <commonscli.version>1.1</commonscli.version>
     <jline.version>0.9.91</jline.version>
 	<spring.version>2.0.6</spring.version>
-	<jfreechart.version>1.0.7</jfreechart.version>
+	<jfreechart.version>1.0.5</jfreechart.version>
   </properties>
   <modules>
     <module>pinpoint-cli</module>
@@ -43,6 +43,7 @@
     <module>pinpoint-loadgenerator</module>
     <module>pinpoint-web</module>
     <module>pinpoint-reports</module>
+    <module>pinpoint-swing</module>
   </modules>
   <build>
     <plugins>



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org