You are viewing a plain text version of this content. The canonical link for it is here.
Posted to general@logging.apache.org by sd...@apache.org on 2010/10/22 09:36:35 UTC
svn commit: r1026230 - in
/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw:
AbstractPreferencePanel.java LogUI.java ReceiverConfigurationPanel.java
TableColorizingRenderer.java plugins/PluginClassLoaderFactory.java
Author: sdeboy
Date: Fri Oct 22 07:36:35 2010
New Revision: 1026230
URL: http://svn.apache.org/viewvc?rev=1026230&view=rev
Log:
Minor button layout updates, changes to support third party look & feels (copy jars to $USERHOME/.chainsaw/plugins and update <lookAndFeelClassName>fully-qualified-class-name</lookAndFeelClassName> in $USERHOME/.chainsaw/chainsaw.settings.xml
Also updated the TableCellRenderer to use a basic JLabel renderer if highlighted search, wrap and time delta rendering aren't enabled (still supports border display & color rules)
Modified:
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/AbstractPreferencePanel.java
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogUI.java
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ReceiverConfigurationPanel.java
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/plugins/PluginClassLoaderFactory.java
Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/AbstractPreferencePanel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/AbstractPreferencePanel.java?rev=1026230&r1=1026229&r2=1026230&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/AbstractPreferencePanel.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/AbstractPreferencePanel.java Fri Oct 22 07:36:35 2010
@@ -112,7 +112,7 @@ public abstract class AbstractPreference
Box buttonBox = Box.createHorizontalBox();
buttonBox.add(Box.createHorizontalGlue());
buttonBox.add(okButton);
- buttonBox.add(Box.createHorizontalStrut(5));
+ buttonBox.add(Box.createHorizontalStrut(10));
buttonBox.add(cancelButton);
add(buttonBox, BorderLayout.SOUTH);
Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogUI.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogUI.java?rev=1026230&r1=1026229&r2=1026230&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogUI.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogUI.java Fri Oct 22 07:36:35 2010
@@ -282,11 +282,11 @@ public class LogUI extends JFrame implem
model.setBypassConfigurationURL(configurationURLAppArg);
}
- applyLookAndFeel(model.getLookAndFeelClassName());
EventQueue.invokeLater(new Runnable()
{
public void run()
{
+ loadLookAndFeelUsingPluginClassLoader(model.getLookAndFeelClassName());
createChainsawGUI(model, null);
}
});
@@ -484,7 +484,6 @@ public class LogUI extends JFrame implem
SettingsManager.getInstance().configure(new ApplicationPreferenceModelSaver(model));
cyclicBufferSize = model.getCyclicBufferSize();
- applyLookAndFeel(model.getLookAndFeelClassName());
handler = new ChainsawAppenderHandler(appender);
handler.addEventBatchListener(new NewTabEventBatchReceiver());
@@ -501,12 +500,11 @@ public class LogUI extends JFrame implem
SettingsManager.getInstance().configure(new ApplicationPreferenceModelSaver(model));
- applyLookAndFeel(model.getLookAndFeelClassName());
-
EventQueue.invokeLater(new Runnable()
{
public void run()
{
+ loadLookAndFeelUsingPluginClassLoader(model.getLookAndFeelClassName());
createChainsawGUI(model, null);
getApplicationPreferenceModel().apply(model);
activateViewer();
@@ -1853,6 +1851,7 @@ public class LogUI extends JFrame implem
UIManager.setLookAndFeel(lookAndFeelClassName);
} catch (Exception e) {
+ e.printStackTrace();
}
}
@@ -2148,6 +2147,22 @@ public class LogUI extends JFrame implem
ensureChainsawAppenderHandlerAdded();
}
+ private static void loadLookAndFeelUsingPluginClassLoader(String lookAndFeelClassName) {
+ ClassLoader classLoader = PluginClassLoaderFactory.getInstance().getClassLoader();
+ ClassLoader previousTCCL = Thread.currentThread().getContextClassLoader();
+ try {
+ // we temporarily swap the TCCL so that plugins can find resources
+ Thread.currentThread().setContextClassLoader(classLoader);
+ UIManager.setLookAndFeel(lookAndFeelClassName);
+ UIManager.getLookAndFeelDefaults().put("ClassLoader", classLoader);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally{
+ // now switch it back...
+ Thread.currentThread().setContextClassLoader(previousTCCL);
+ }
+ }
+
/**
* Makes sure that the LoggerRepository has the ChainsawAppenderHandler
* added to the root logger so Chainsaw can receive all the events.
Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ReceiverConfigurationPanel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ReceiverConfigurationPanel.java?rev=1026230&r1=1026229&r2=1026230&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ReceiverConfigurationPanel.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ReceiverConfigurationPanel.java Fri Oct 22 07:36:35 2010
@@ -214,6 +214,7 @@ class ReceiverConfigurationPanel extends
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 1;
c.gridy = 0;
+ c.insets = new Insets(0, 0, 0, 10);
okButton = new JButton(" OK ");
panel.add(okButton, c);
Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java?rev=1026230&r1=1026229&r2=1026230&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java Fri Oct 22 07:36:35 2010
@@ -188,8 +188,16 @@ public class TableColorizingRenderer ext
int colIndex = tableColumn.getModelIndex() + 1;
//no event, use default renderer
- if (loggingEventWrapper == null) {
- return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
+
+ JLabel basicComponent = null;
+ boolean basic = (!wrap && !highlightSearchMatchText && !logPanelPreferenceModel.isShowMillisDeltaAsGap());
+ if (basic || loggingEventWrapper == null) {
+ Component rendererComponent = super.getTableCellRendererComponent(table, value, false, false, row, col);
+ if (!(rendererComponent instanceof JLabel) || loggingEventWrapper == null) {
+ return rendererComponent;
+ }
+ basicComponent = (JLabel)rendererComponent;
+ setBasicComponentBorder(basicComponent, isSelected, table, col);
}
long delta = 0;
if (row > 0) {
@@ -203,6 +211,9 @@ public class TableColorizingRenderer ext
switch (colIndex) {
case ChainsawColumns.INDEX_THROWABLE_COL_NAME:
if (value instanceof String[] && ((String[])value).length > 0){
+ if (basic) {
+ basicComponent.setText(((String[])value)[0]);
+ } else {
Style tabStyle = singleLineTextPane.getLogicalStyle();
StyleConstants.setTabSet(tabStyle, tabs);
//set the 1st tab at position 3
@@ -215,11 +226,20 @@ public class TableColorizingRenderer ext
} else {
singleLineTextPane.setText(((String[])value)[0]);
}
+ }
} else {
- singleLineTextPane.setText("");
+ if (basic) {
+ basicComponent.setText("");
+ } else {
+ singleLineTextPane.setText("");
+ }
+ }
+ if (basic) {
+ component = basicComponent;
+ } else {
+ layoutRenderingPanel(generalPanel, singleLineTextPane, delta, isSelected, width, col, table);
+ component = generalPanel;
}
- layoutRenderingPanel(generalPanel, singleLineTextPane, delta, isSelected, width, col, table);
- component = generalPanel;
break;
case ChainsawColumns.INDEX_LOGGER_COL_NAME:
String logger = value.toString();
@@ -231,49 +251,88 @@ public class TableColorizingRenderer ext
break;
}
}
+ if (basic) {
+ basicComponent.setText(logger.substring(startPos + 1));
+ component = basicComponent;
+ } else {
singleLineTextPane.setText(logger.substring(startPos + 1));
setHighlightAttributesInternal(matches.get(LoggingEventFieldResolver.LOGGER_FIELD), (StyledDocument) singleLineTextPane.getDocument());
layoutRenderingPanel(generalPanel, singleLineTextPane, delta, isSelected, width, col, table);
component = generalPanel;
+ }
break;
case ChainsawColumns.INDEX_ID_COL_NAME:
+ if (basic) {
+ basicComponent.setText(value.toString());
+ component = basicComponent;
+ } else {
singleLineTextPane.setText(value.toString());
setHighlightAttributesInternal(matches.get(LoggingEventFieldResolver.PROP_FIELD + "LOG4JID"), (StyledDocument) singleLineTextPane.getDocument());
layoutRenderingPanel(generalPanel, singleLineTextPane, delta, isSelected, width, col, table);
component = generalPanel;
+ }
break;
case ChainsawColumns.INDEX_CLASS_COL_NAME:
+ if (basic) {
+ basicComponent.setText(value.toString());
+ component = basicComponent;
+ } else {
singleLineTextPane.setText(value.toString());
setHighlightAttributesInternal(matches.get(LoggingEventFieldResolver.CLASS_FIELD), (StyledDocument) singleLineTextPane.getDocument());
layoutRenderingPanel(generalPanel, singleLineTextPane, delta, isSelected, width, col, table);
component = generalPanel;
+ }
break;
case ChainsawColumns.INDEX_FILE_COL_NAME:
+ if (basic) {
+ basicComponent.setText(value.toString());
+ component = basicComponent;
+ } else {
singleLineTextPane.setText(value.toString());
setHighlightAttributesInternal(matches.get(LoggingEventFieldResolver.FILE_FIELD), (StyledDocument) singleLineTextPane.getDocument());
layoutRenderingPanel(generalPanel, singleLineTextPane, delta, isSelected, width, col, table);
component = generalPanel;
+ }
break;
case ChainsawColumns.INDEX_LINE_COL_NAME:
+ if (basic) {
+ basicComponent.setText(value.toString());
+ component = basicComponent;
+ } else {
singleLineTextPane.setText(value.toString());
setHighlightAttributesInternal(matches.get(LoggingEventFieldResolver.LINE_FIELD), (StyledDocument) singleLineTextPane.getDocument());
layoutRenderingPanel(generalPanel, singleLineTextPane, delta, isSelected, width, col, table);
component = generalPanel;
+ }
break;
case ChainsawColumns.INDEX_NDC_COL_NAME:
+ if (basic) {
+ basicComponent.setText(value.toString());
+ component = basicComponent;
+ } else {
singleLineTextPane.setText(value.toString());
setHighlightAttributesInternal(matches.get(LoggingEventFieldResolver.NDC_FIELD), (StyledDocument) singleLineTextPane.getDocument());
layoutRenderingPanel(generalPanel, singleLineTextPane, delta, isSelected, width, col, table);
component = generalPanel;
+ }
break;
case ChainsawColumns.INDEX_THREAD_COL_NAME:
+ if (basic) {
+ basicComponent.setText(value.toString());
+ component = basicComponent;
+ } else {
singleLineTextPane.setText(value.toString());
setHighlightAttributesInternal(matches.get(LoggingEventFieldResolver.THREAD_FIELD), (StyledDocument) singleLineTextPane.getDocument());
layoutRenderingPanel(generalPanel, singleLineTextPane, delta, isSelected, width, col, table);
component = generalPanel;
+ }
break;
case ChainsawColumns.INDEX_TIMESTAMP_COL_NAME:
//timestamp matches contain the millis..not the display text..just highlight if we have a match for the timestamp field
+ if (basic) {
+ basicComponent.setText(value.toString());
+ component = basicComponent;
+ } else {
Set timestampMatches = (Set)matches.get(LoggingEventFieldResolver.TIMESTAMP_FIELD);
if (timestampMatches != null && timestampMatches.size() > 0) {
singleLineTextPane.setText(value.toString());
@@ -283,16 +342,26 @@ public class TableColorizingRenderer ext
}
layoutRenderingPanel(generalPanel, singleLineTextPane, delta, isSelected, width, col, table);
component = generalPanel;
+ }
break;
case ChainsawColumns.INDEX_METHOD_COL_NAME:
+ if (basic) {
+ basicComponent.setText(value.toString());
+ component = basicComponent;
+ } else {
singleLineTextPane.setText(value.toString());
setHighlightAttributesInternal(matches.get(LoggingEventFieldResolver.METHOD_FIELD), (StyledDocument) singleLineTextPane.getDocument());
layoutRenderingPanel(generalPanel, singleLineTextPane, delta, isSelected, width, col, table);
component = generalPanel;
+ }
break;
case ChainsawColumns.INDEX_LOG4J_MARKER_COL_NAME:
case ChainsawColumns.INDEX_MESSAGE_COL_NAME:
String thisString = value.toString().trim();
+ if (basic) {
+ basicComponent.setText(thisString);
+ component = basicComponent;
+ } else {
JTextPane textPane = wrap ? multiLineTextPane : singleLineTextPane;
JComponent textPaneContainer = wrap ? multiLinePanel : generalPanel;
textPane.setText(thisString);
@@ -313,23 +382,6 @@ public class TableColorizingRenderer ext
}
textPaneContainer.add(textPane, BorderLayout.SOUTH);
- if (delta == 0 || !logPanelPreferenceModel.isShowMillisDeltaAsGap()) {
- if (col == 0) {
- textPane.setBorder(getLeftBorder(isSelected, delta));
- } else if (col == table.getColumnCount() - 1) {
- textPane.setBorder(getRightBorder(isSelected, delta));
- } else {
- textPane.setBorder(getMiddleBorder(isSelected, delta));
- }
- } else {
- if (col == 0) {
- textPane.setBorder(getLeftBorder(isSelected, 0));
- } else if (col == table.getColumnCount() - 1) {
- textPane.setBorder(getRightBorder(isSelected, 0));
- } else {
- textPane.setBorder(getMiddleBorder(isSelected, 0));
- }
- }
int currentMarkerHeight = loggingEventWrapper.getMarkerHeight();
int currentMsgHeight = loggingEventWrapper.getMsgHeight();
int newRowHeight = ChainsawConstants.DEFAULT_ROW_HEIGHT;
@@ -373,28 +425,54 @@ public class TableColorizingRenderer ext
}
component = textPaneContainer;
+ setComponentBorder(component, isSelected, table, col, delta);
+ }
break;
case ChainsawColumns.INDEX_LEVEL_COL_NAME:
if (levelUseIcons) {
- levelTextPane.setText("");
- levelTextPane.insertIcon((Icon) iconMap.get(value.toString()));
- if (!toolTipsVisible) {
- levelTextPane.setToolTipText(value.toString());
+ if (basic) {
+ basicComponent.setText("");
+ if (!toolTipsVisible) {
+ basicComponent.setToolTipText(value.toString());
+ }
+ } else {
+ levelTextPane.setText("");
+ levelTextPane.insertIcon((Icon) iconMap.get(value.toString()));
+ if (!toolTipsVisible) {
+ levelTextPane.setToolTipText(value.toString());
+ }
}
} else {
- levelTextPane.setText(value.toString());
- setHighlightAttributesInternal(matches.get(LoggingEventFieldResolver.LEVEL_FIELD), (StyledDocument) levelTextPane.getDocument());
- if (!toolTipsVisible) {
- levelTextPane.setToolTipText(null);
+ if (basic) {
+ basicComponent.setText(value.toString());
+ if (!toolTipsVisible) {
+ basicComponent.setToolTipText(null);
+ }
+ } else {
+ levelTextPane.setText(value.toString());
+ setHighlightAttributesInternal(matches.get(LoggingEventFieldResolver.LEVEL_FIELD), (StyledDocument) levelTextPane.getDocument());
+ if (!toolTipsVisible) {
+ levelTextPane.setToolTipText(null);
+ }
}
}
if (toolTipsVisible) {
+ if (basic) {
+ basicComponent.setToolTipText(label.getToolTipText());
+ } else {
levelTextPane.setToolTipText(label.getToolTipText());
+ }
+ }
+ if (basic) {
+ basicComponent.setForeground(label.getForeground());
+ basicComponent.setBackground(label.getBackground());
+ component = basicComponent;
+ } else {
+ levelTextPane.setForeground(label.getForeground());
+ levelTextPane.setBackground(label.getBackground());
+ layoutRenderingPanel(levelPanel, levelTextPane, delta, isSelected, width, col, table);
+ component = levelPanel;
}
- levelTextPane.setForeground(label.getForeground());
- levelTextPane.setBackground(label.getBackground());
- layoutRenderingPanel(levelPanel, levelTextPane, delta, isSelected, width, col, table);
- component = levelPanel;
break;
//remaining entries are properties
@@ -413,13 +491,26 @@ public class TableColorizingRenderer ext
if (thisProp != null) {
String propKey = LoggingEventFieldResolver.PROP_FIELD + thisProp.toUpperCase();
Set propKeyMatches = (Set)matches.get(propKey);
- singleLineTextPane.setText(loggingEventWrapper.getLoggingEvent().getProperty(thisProp));
+ String propertyValue = loggingEventWrapper.getLoggingEvent().getProperty(thisProp);
+ if (basic) {
+ basicComponent.setText(propertyValue);
+ } else {
+ singleLineTextPane.setText(propertyValue);
setHighlightAttributesInternal(propKeyMatches, (StyledDocument) singleLineTextPane.getDocument());
+ }
} else {
+ if (basic) {
+ basicComponent.setText("");
+ } else {
singleLineTextPane.setText("");
+ }
}
+ if (basic) {
+ component = basicComponent;
+ } else {
layoutRenderingPanel(generalPanel, singleLineTextPane, delta, isSelected, width, col, table);
component = generalPanel;
+ }
break;
}
@@ -454,16 +545,40 @@ public class TableColorizingRenderer ext
component.setForeground(foreground);
//update the background & foreground of the jtextpane using styles
- if (multiLineTextPane != null)
- {
- updateColors(multiLineTextPane, background, foreground);
+ if (!basic) {
+ if (multiLineTextPane != null)
+ {
+ updateColors(multiLineTextPane, background, foreground);
+ }
+ updateColors(levelTextPane, background, foreground);
+ updateColors(singleLineTextPane, background, foreground);
}
- updateColors(levelTextPane, background, foreground);
- updateColors(singleLineTextPane, background, foreground);
-
return component;
}
+ private void setBasicComponentBorder(JComponent component, boolean isSelected, JTable table, int col) {
+ setComponentBorder(component, isSelected, table, col, 0);
+ }
+
+ private void setComponentBorder(JComponent component, boolean isSelected, JTable table, int col, long delta) {
+ if (delta == 0 || !logPanelPreferenceModel.isShowMillisDeltaAsGap()) {
+ if (col == 0) {
+ component.setBorder(getLeftBorder(isSelected, delta));
+ } else if (col == table.getColumnCount() - 1) {
+ component.setBorder(getRightBorder(isSelected, delta));
+ } else {
+ component.setBorder(getMiddleBorder(isSelected, delta));
+ }
+ } else {
+ if (col == 0) {
+ component.setBorder(getLeftBorder(isSelected, 0));
+ } else if (col == table.getColumnCount() - 1) {
+ component.setBorder(getRightBorder(isSelected, 0));
+ } else {
+ component.setBorder(getMiddleBorder(isSelected, 0));
+ }
+ }
+ }
private void layoutRenderingPanel(JComponent container, JComponent bottomComponent, long delta, boolean isSelected,
int width, int col, JTable table) {
container.removeAll();
Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/plugins/PluginClassLoaderFactory.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/plugins/PluginClassLoaderFactory.java?rev=1026230&r1=1026229&r2=1026230&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/plugins/PluginClassLoaderFactory.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/plugins/PluginClassLoaderFactory.java Fri Oct 22 07:36:35 2010
@@ -23,8 +23,6 @@ import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
import org.apache.log4j.chainsaw.prefs.SettingsManager;
/**
@@ -40,13 +38,9 @@ import org.apache.log4j.chainsaw.prefs.S
*/
public class PluginClassLoaderFactory {
private final ClassLoader pluginClassLoader;
- private static final Logger logger = LogManager.getLogger(PluginClassLoaderFactory.class);
-
+
private static final PluginClassLoaderFactory instance = new PluginClassLoaderFactory();
- /**
- * @param urls
- */
private PluginClassLoaderFactory() {
this.pluginClassLoader= PluginClassLoaderFactory.create(new File(SettingsManager.getInstance().getSettingsDirectory() + File.separator + "plugins"));
@@ -73,7 +67,7 @@ public class PluginClassLoaderFactory {
*/
private static final ClassLoader create(File pluginDirectory) {
if(pluginDirectory == null || !pluginDirectory.exists() || !pluginDirectory.canRead()) {
- logger.error("pluginDirectory cannot be null, and it must exist and must be readable, using the normal Classloader");
+ System.err.println("pluginDirectory cannot be null, and it must exist and must be readable, using the normal Classloader");
return PluginClassLoaderFactory.class.getClassLoader();
}
@@ -97,10 +91,10 @@ public class PluginClassLoaderFactory {
File file = new File(pluginDirectory, name);
try {
list.add(file.toURI().toURL());
- logger.info("Added " + file.getAbsolutePath()
+ System.out.println("Added " + file.getAbsolutePath()
+ " to Plugin class loader list");
} catch (Exception e) {
- logger.error("Failed to retrieve the URL for file: "
+ System.err.println("Failed to retrieve the URL for file: "
+ file.getAbsolutePath());
throw new RuntimeException(e.getMessage());
}