r2324 - in trunk: jaxx-demo/src/main/java/jaxx/demo jaxx-demo/src/main/resources jaxx-demo/src/main/resources/i18n jaxx-widgets jaxx-widgets/src/main/java/jaxx/runtime/swing jaxx-widgets/src/main/java/jaxx/runtime/swing/log
Author: sletellier Date: 2012-06-01 18:15:02 +0200 (Fri, 01 Jun 2012) New Revision: 2324 Url: http://nuiton.org/repositories/revision/jaxx/2324 Log: fixes #2124 : Add ui to display log from log4j appender Added: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/log/ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/log/JAXXLog4jAppender.java trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/log/JAXXLog4jHandler.java trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/log/JAXXLog4jUI.jaxx Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/DemoUI.css trunk/jaxx-demo/src/main/java/jaxx/demo/DemoUI.jaxx trunk/jaxx-demo/src/main/java/jaxx/demo/DemoUIHandler.java trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo_en_GB.properties trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo_es_ES.properties trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo_fr_FR.properties trunk/jaxx-demo/src/main/resources/log4j.properties trunk/jaxx-widgets/pom.xml Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/DemoUI.css =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/DemoUI.css 2012-05-30 17:46:08 UTC (rev 2323) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/DemoUI.css 2012-06-01 16:15:02 UTC (rev 2324) @@ -112,6 +112,11 @@ _help:{"ui.main.menu.file.exit"}; } +#menuLogs { + text:"jaxxdemo.menu.showLogs"; + _help:{"ui.main.menu.showLogs"}; +} + #menuHelp { text:"jaxxdemo.menu.help"; mnemonic:e; Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/DemoUI.jaxx =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/DemoUI.jaxx 2012-05-30 17:46:08 UTC (rev 2323) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/DemoUI.jaxx 2012-06-01 16:15:02 UTC (rev 2324) @@ -85,6 +85,8 @@ </JMenu> <JMenu id='menuHelp'> + <JMenuItem id='menuLogs' + onActionPerformed="getHandler().showLogs(this)"/> <JMenuItem id='menuHelpHelp' onActionPerformed="getHandler().showHelp(this, null)"/> <JMenuItem id='menuHelpSite' Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/DemoUIHandler.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/DemoUIHandler.java 2012-05-30 17:46:08 UTC (rev 2323) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/DemoUIHandler.java 2012-06-01 16:15:02 UTC (rev 2324) @@ -52,6 +52,7 @@ import jaxx.runtime.context.DefaultApplicationContext; import jaxx.runtime.context.JAXXContextEntryDef; import jaxx.runtime.context.JAXXInitialContext; +import jaxx.runtime.swing.log.JAXXLog4jUI; import org.nuiton.util.decorator.DecoratorProvider; import jaxx.runtime.swing.AboutPanel; import jaxx.runtime.swing.ErrorDialogUI; @@ -445,6 +446,14 @@ // mainUI.getHelp().setCurrentID(helpId); } + public void showLogs(DemoUI ui) { + + JAXXLog4jUI log4jUI = new JAXXLog4jUI("jaxxDemoAppender"); + String title = _("jaxxdemo.title.showLog"); + log4jUI.setTitle(title); + log4jUI.showInDialog(ui, false); + } + public void gotoSite(JAXXContext context) { DemoUI ui = getUI(context); Modified: trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo_en_GB.properties =================================================================== --- trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo_en_GB.properties 2012-05-30 17:46:08 UTC (rev 2323) +++ trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo_en_GB.properties 2012-06-01 16:15:02 UTC (rev 2324) @@ -204,6 +204,7 @@ jaxxdemo.menu.file=File jaxxdemo.menu.file.locale=Languages jaxxdemo.menu.help= +jaxxdemo.menu.showLogs=Show logs jaxxdemo.message.config.loaded=Configuration of JAXXDemo v. %1$s loaded. jaxxdemo.message.goto.site=Go to JAXXDemo Web site jaxxdemo.navigation.actor.title=Actor @@ -227,6 +228,7 @@ jaxxdemo.timeeditor.model=Result jaxxdemo.timeeditor.value=Selected time \: %1$tH\:%1$tM jaxxdemo.title.about=About JAXXDemo... +jaxxdemo.title.showLog=JAXXDemo logs jaxxdemo.tree.tabtitle=Tree jaxxdemo.treeTable.tabtitle=TreeTable jaxxdemo.warning.nimbus.landf=Could not init nymbus look and feel, you need at leasr version 1.6u10 of java. Modified: trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo_es_ES.properties =================================================================== --- trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo_es_ES.properties 2012-05-30 17:46:08 UTC (rev 2323) +++ trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo_es_ES.properties 2012-06-01 16:15:02 UTC (rev 2324) @@ -204,6 +204,7 @@ jaxxdemo.menu.file=Fichier jaxxdemo.menu.file.locale=Langues jaxxdemo.menu.help=Aide +jaxxdemo.menu.showLogs=Afficher les logs jaxxdemo.message.config.loaded=Configuration de JAXX Demo v. %1$s chargée. jaxxdemo.message.goto.site=Accéder au site de JAXX Demo (%1$s) jaxxdemo.navigation.actor.title=Acteur @@ -227,6 +228,7 @@ jaxxdemo.timeeditor.model=Résultat jaxxdemo.timeeditor.value=Heure sélectionnée \: %1$tH\:%1$tM jaxxdemo.title.about=A propos de JAXX Demo... +jaxxdemo.title.showLog=Logs de JAXX Demo jaxxdemo.tree.tabtitle=Arbre jaxxdemo.treeTable.tabtitle=Arbre tableau jaxxdemo.warning.nimbus.landf=Le look and Feel Nimbus n'a pas été trouvé, il faut au moins la version 1.6u10 de java. Modified: trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo_fr_FR.properties =================================================================== --- trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo_fr_FR.properties 2012-05-30 17:46:08 UTC (rev 2323) +++ trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo_fr_FR.properties 2012-06-01 16:15:02 UTC (rev 2324) @@ -204,6 +204,7 @@ jaxxdemo.menu.file=Fichier jaxxdemo.menu.file.locale=Langues jaxxdemo.menu.help=Aide +jaxxdemo.menu.showLogs=Afficher les logs jaxxdemo.message.config.loaded=Configuration de JAXX Demo v. %1$s chargée. jaxxdemo.message.goto.site=Accéder au site de JAXX Demo (%1$s) jaxxdemo.navigation.actor.title=Acteur @@ -227,6 +228,7 @@ jaxxdemo.timeeditor.model=Résultat jaxxdemo.timeeditor.value=Heure sélectionnée \: %1$tH\:%1$tM jaxxdemo.title.about=A propos de JAXX Demo... +jaxxdemo.title.showLog=Logs de JAXX Demo jaxxdemo.tree.tabtitle=Arbre jaxxdemo.treeTable.tabtitle=Arbre tableau jaxxdemo.warning.nimbus.landf=Le look and Feel Nimbus n'a pas été trouvé, il faut au moins la version 1.6u10 de java. Modified: trunk/jaxx-demo/src/main/resources/log4j.properties =================================================================== --- trunk/jaxx-demo/src/main/resources/log4j.properties 2012-05-30 17:46:08 UTC (rev 2323) +++ trunk/jaxx-demo/src/main/resources/log4j.properties 2012-06-01 16:15:02 UTC (rev 2324) @@ -23,12 +23,17 @@ # #L% ### # Global logging configuration -log4j.rootLogger=ERROR, stdout +log4j.rootLogger=ERROR, stdout, jaxxDemoAppender # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) %M - %m%n +# JAXX output +log4j.appender.jaxxDemoAppender=jaxx.runtime.swing.log.JAXXLog4jAppender +log4j.appender.jaxxDemoAppender.layout=org.apache.log4j.PatternLayout +log4j.appender.jaxxDemoAppender.layout.ConversionPattern=%5p [%t] (%F:%L) %M - %m%n + log4j.logger.jaxx=INFO #log4j.logger.jaxx.demo=INFO log4j.logger.jaxx.demo.tree=DEBUG Modified: trunk/jaxx-widgets/pom.xml =================================================================== --- trunk/jaxx-widgets/pom.xml 2012-05-30 17:46:08 UTC (rev 2323) +++ trunk/jaxx-widgets/pom.xml 2012-06-01 16:15:02 UTC (rev 2324) @@ -94,7 +94,6 @@ <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> - <scope>test</scope> </dependency> <dependency> @@ -172,4 +171,4 @@ </plugins> </build> -</project> \ No newline at end of file +</project> Added: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/log/JAXXLog4jAppender.java =================================================================== --- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/log/JAXXLog4jAppender.java (rev 0) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/log/JAXXLog4jAppender.java 2012-06-01 16:15:02 UTC (rev 2324) @@ -0,0 +1,141 @@ +/* + * #%L + * JAXX :: Widgets + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2012 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ +package jaxx.runtime.swing.log; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.util.LinkedList; +import java.util.List; +import org.apache.log4j.Level; +import org.apache.log4j.WriterAppender; +import org.apache.log4j.spi.LoggingEvent; + +/** + * @author sletellier <letellier@codelutin.com> + */ +public class JAXXLog4jAppender extends WriterAppender { + + public static final String PROPERTY_LOGS = "logs"; + public static final String PROPERTY_LEVEL = "level"; + + protected List<LoggingEvent> events; + protected StringBuilder logs; + protected Level level; + + protected final PropertyChangeSupport pcs = new PropertyChangeSupport(this); + + public JAXXLog4jAppender() { + events = new LinkedList<LoggingEvent>(); + logs = new StringBuilder(); + } + + public String getLogs() { + return logs.toString(); + } + + public void setLogs(String logs) { + String oldValue = getLogs(); + this.logs = new StringBuilder(logs); + firePropertyChange(PROPERTY_LOGS, oldValue, logs); + } + + public Level getLevel() { + if (level == null) { + level = Level.ALL; + } + return level; + } + + public void setLevel(Level level) { + Level oldValue = getLevel(); + this.level = level; + firePropertyChange(PROPERTY_LEVEL, oldValue, level); + updateLogs(); + } + + @Override + public void append(LoggingEvent event) { + super.append(event); + if (event != null) { + events.add(event); + updateLog(event); + } + } + + protected void updateLogs() { + String oldValue = getLogs(); + logs = new StringBuilder(); + for (LoggingEvent event : events) { + updateLog(event); + } + firePropertyChange(PROPERTY_LOGS, oldValue, getLogs()); + } + + protected void updateLog(LoggingEvent event) { + Level level = event.getLevel(); + if (getLevel() != null && level.isGreaterOrEqual(getLevel())) { + String log = this.layout.format(event); + appendLog(log); + if(layout.ignoresThrowable()) { + String[] errorLogs = event.getThrowableStrRep(); + if (errorLogs != null) { + for (String errorLog : errorLogs) { + appendLog(errorLog + "\n"); + } + } + } + } + } + + protected void appendLog(String log) { + String oldValue = getLogs(); + logs.append(log); + firePropertyChange(PROPERTY_LOGS, oldValue, getLogs()); + } + + public void addPropertyChangeListener(PropertyChangeListener listener) { + pcs.addPropertyChangeListener(listener); + } + + public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { + pcs.addPropertyChangeListener(propertyName, listener); + } + + public void removePropertyChangeListener(PropertyChangeListener listener) { + pcs.removePropertyChangeListener(listener); + } + + public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { + pcs.removePropertyChangeListener(propertyName, listener); + } + + protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { + pcs.firePropertyChange(propertyName, oldValue, newValue); + } + + protected void firePropertyChange(String propertyName, Object newValue) { + firePropertyChange(propertyName, null, newValue); + } +} Added: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/log/JAXXLog4jHandler.java =================================================================== --- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/log/JAXXLog4jHandler.java (rev 0) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/log/JAXXLog4jHandler.java 2012-06-01 16:15:02 UTC (rev 2324) @@ -0,0 +1,106 @@ +/* + * #%L + * JAXX :: Widgets + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2012 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ +package jaxx.runtime.swing.log; + +import java.awt.Component; +import java.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JRootPane; +import javax.swing.KeyStroke; +import jaxx.runtime.JAXXUtil; +import jaxx.runtime.SwingUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.log4j.Logger; + +/** + * @author sletellier <letellier@codelutin.com> + */ +public class JAXXLog4jHandler { + + private static final Log log = LogFactory.getLog(JAXXLog4jHandler.class); + + protected JAXXLog4jUI ui; + + public JAXXLog4jHandler(JAXXLog4jUI ui) { + this.ui = ui; + } + + final protected Action closeAction = new AbstractAction("close") { + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + JDialog container = ui.getParentContainer(JDialog.class); + if (container != null) { + container.dispose(); + } else { + ui.setVisible(false); + } + } + }; + + public JAXXLog4jAppender getAppender(String appenderName) { + + Logger logger = Logger.getRootLogger(); + try { + JAXXLog4jAppender appender = (JAXXLog4jAppender) logger.getAppender(appenderName); + return appender; + } catch (ClassCastException eee) { + log.error("Appender '" + appenderName + "' must be an jaxx.runtime.swing.log.JAXXLog4jAppender", eee); + throw eee; + } + } + + public void showInDialog(Frame ui, boolean undecorated) { + JDialog f = new JDialog(ui, this.ui.getTitle(), false); + f.add(this.ui); + f.setResizable(true); + f.setSize(550, 450); + f.setUndecorated(undecorated); + JRootPane rootPane = f.getRootPane(); + rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("ESCAPE"), "close"); + rootPane.getActionMap().put("close", closeAction); + f.addWindowListener(new WindowAdapter() { + @Override + public void windowClosed(WindowEvent e) { + Component ui = (Component) e.getSource(); + if (log.isInfoEnabled()) { + log.info("destroy ui " + ui); + } + JAXXUtil.destroy(ui); + JAXXUtil.destroy(JAXXLog4jHandler.this.ui); + } + }); + SwingUtil.center(ui, f); + f.setVisible(true); + } +} Added: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/log/JAXXLog4jUI.jaxx =================================================================== --- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/log/JAXXLog4jUI.jaxx (rev 0) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/log/JAXXLog4jUI.jaxx 2012-06-01 16:15:02 UTC (rev 2324) @@ -0,0 +1,109 @@ +<!-- + #%L + JAXX :: Widgets + + $Id$ + $HeadURL$ + %% + Copyright (C) 2008 - 2012 CodeLutin + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Lesser Public License for more details. + + You should have received a copy of the GNU General Lesser Public + License along with this program. If not, see + <http://www.gnu.org/licenses/lgpl-3.0.html>. + #L% + --> +<JPanel id='log4jUI' layout='{new BorderLayout()}'> + + <import> + java.awt.Frame + org.apache.log4j.Level + </import> + + <script><![CDATA[ + protected String appenderName; + + public JAXXLog4jUI(String appenderName) { + this.appenderName = appenderName; + } + + public void showInDialog(Frame ui, boolean undecorated) { + handler.showInDialog(ui, undecorated); + } + ]]></script> + + <String id='title' javaBean='null'/> + + <JAXXLog4jHandler id='handler' constructorParams='this'/> + + <JAXXLog4jAppender id='model' initializer='getHandler().getAppender(appenderName)'/> + + <JScrollPane constraints='BorderLayout.CENTER'> + <JTextArea id='logArea' + text='{model.getLogs()}'/> + </JScrollPane> + + <Table constraints='BorderLayout.SOUTH'> + <row> + <cell> + <JRadioButton id='fatalRadio' + buttonGroup="levelRadioGroup" + text='{Level.FATAL.toString()}' + value='{Level.FATAL}' + onActionPerformed='model.setLevel(Level.FATAL)'/> + </cell> + <cell> + <JRadioButton id='errorRadio' + buttonGroup="levelRadioGroup" + text='{Level.ERROR.toString()}' + value='{Level.ERROR}' + onActionPerformed='model.setLevel(Level.ERROR)'/> + </cell> + <cell> + <JRadioButton id='warnRadio' + buttonGroup="levelRadioGroup" + text='{Level.WARN.toString()}' + value='{Level.WARN}' + onActionPerformed='model.setLevel(Level.WARN)'/> + </cell> + <cell> + <JRadioButton id='infoRadio' + buttonGroup="levelRadioGroup" + text='{Level.INFO.toString()}' + value='{Level.INFO}' + onActionPerformed='model.setLevel(Level.INFO)'/> + </cell> + <cell> + <JRadioButton id='debugRadio' + buttonGroup="levelRadioGroup" + text='{Level.DEBUG.toString()}' + value='{Level.DEBUG}' + onActionPerformed='model.setLevel(Level.DEBUG)'/> + </cell> + <cell> + <JRadioButton id='traceRadio' + buttonGroup="levelRadioGroup" + text='{Level.TRACE.toString()}' + value='{Level.TRACE}' + onActionPerformed='model.setLevel(Level.TRACE)'/> + </cell> + <cell> + <JRadioButton id='allRadio' + buttonGroup="levelRadioGroup" + text='{Level.ALL.toString()}' + value='{Level.ALL}' + selected='true' + onActionPerformed='model.setLevel(Level.ALL)'/> + </cell> + </row> + </Table> +</JPanel> \ No newline at end of file
participants (1)
-
sletellier@users.nuiton.org