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