You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2019/04/07 12:30:56 UTC

[lucene-solr] 16/34: Change logging a bit: do textarea update async; fix locking; centralize name of log file

This is an automated email from the ASF dual-hosted git repository.

uschindler pushed a commit to branch jira/lucene-2562-luke-swing-3
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit 347095128ba9856f5b907fc5f5c5f7f377c81a4e
Author: Uwe Schindler <us...@apache.org>
AuthorDate: Fri Apr 5 18:11:16 2019 +0200

    Change logging a bit: do textarea update async; fix locking; centralize name of log file
---
 .../apache/lucene/luke/app/desktop/LukeMain.java   | 10 +++++--
 .../app/desktop/components/LogsPanelProvider.java  |  8 ++---
 .../luke/app/desktop/util/TextAreaAppender.java    | 35 ++++++++++++++--------
 .../org/apache/lucene/luke/util/LoggerFactory.java |  7 +++--
 4 files changed, 37 insertions(+), 23 deletions(-)

diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/LukeMain.java b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/LukeMain.java
index 673127d..fae52f2 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/LukeMain.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/LukeMain.java
@@ -22,6 +22,7 @@ import javax.swing.UIManager;
 import java.awt.GraphicsEnvironment;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
+import java.nio.file.FileSystems;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.lucene.luke.app.desktop.components.LukeWindowProvider;
@@ -36,11 +37,15 @@ import static org.apache.lucene.luke.app.desktop.util.ExceptionHandler.handle;
 /** Entry class for desktop Luke */
 public class LukeMain {
 
+  public static final String LOG_FILE = System.getProperty("user.home") +
+      FileSystems.getDefault().getSeparator() + ".luke.d" +
+      FileSystems.getDefault().getSeparator() + "luke.log";
+
   static {
-    LoggerFactory.initGuiLogging();
+    LoggerFactory.initGuiLogging(LOG_FILE);
   }
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
+  
   private static JFrame frame;
 
   public static JFrame getOwnerFrame() {
@@ -48,7 +53,6 @@ public class LukeMain {
   }
 
   private static void createAndShowGUI() {
-
     // uncaught error handler
     MessageBroker messageBroker = MessageBroker.getInstance();
     Thread.setDefaultUncaughtExceptionHandler((thread, cause) ->
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/LogsPanelProvider.java b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/LogsPanelProvider.java
index 2cf385f..1d27cea 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/LogsPanelProvider.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/components/LogsPanelProvider.java
@@ -24,17 +24,13 @@ import javax.swing.JScrollPane;
 import javax.swing.JTextArea;
 import java.awt.BorderLayout;
 import java.awt.FlowLayout;
-import java.nio.file.FileSystems;
 
+import org.apache.lucene.luke.app.desktop.LukeMain;
 import org.apache.lucene.luke.app.desktop.util.MessageUtils;
 
 /** Provider of the Logs panel */
 public final class LogsPanelProvider {
 
-  private static final String LOG_FILE = System.getProperty("user.home") +
-      FileSystems.getDefault().getSeparator() + ".luke.d" +
-      FileSystems.getDefault().getSeparator() + "luke.log";
-
   private final JTextArea logTextArea;
 
   public LogsPanelProvider(JTextArea logTextArea) {
@@ -50,7 +46,7 @@ public final class LogsPanelProvider {
     header.setOpaque(false);
     header.add(new JLabel(MessageUtils.getLocalizedMessage("logs.label.see_also")));
 
-    JLabel logPathLabel = new JLabel(LOG_FILE);
+    JLabel logPathLabel = new JLabel(LukeMain.LOG_FILE);
     header.add(logPathLabel);
 
     panel.add(header, BorderLayout.PAGE_START);
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/util/TextAreaAppender.java b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/util/TextAreaAppender.java
index b577b67..41cab03 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/util/TextAreaAppender.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/app/desktop/util/TextAreaAppender.java
@@ -18,8 +18,9 @@
 package org.apache.lucene.luke.app.desktop.util;
 
 import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+
 import java.io.Serializable;
-import java.nio.charset.StandardCharsets;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -28,6 +29,7 @@ import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Core;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.StringLayout;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
 import org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender;
 import org.apache.logging.log4j.core.config.Property;
@@ -40,8 +42,9 @@ public final class TextAreaAppender extends AbstractAppender {
 
   private static JTextArea textArea;
 
-  private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
-  private final Lock readLock = rwLock.readLock();
+  private static final ReadWriteLock rwLock = new ReentrantReadWriteLock();
+  private static final Lock readLock = rwLock.readLock();
+  private static final Lock writeLock = rwLock.writeLock();
 
   protected TextAreaAppender(String name, Filter filter,
                              org.apache.logging.log4j.core.Layout<? extends Serializable> layout, final boolean ignoreExceptions) {
@@ -49,22 +52,30 @@ public final class TextAreaAppender extends AbstractAppender {
   }
 
   public static void setTextArea(JTextArea ta) {
-    if (textArea != null) {
-      throw new IllegalStateException("TextArea already set.");
+    writeLock.lock();
+    try {
+      if (textArea != null) {
+        throw new IllegalStateException("TextArea already set.");
+      }
+      textArea = ta;
+    } finally {
+      writeLock.unlock();
     }
-    textArea = ta;
   }
 
   @Override
   public void append(LogEvent event) {
-    if (textArea == null) {
-      throw new IllegalStateException();
-    }
-
     readLock.lock();
     try {
-      String message = new String(getLayout().toByteArray(event), StandardCharsets.UTF_8);
-      textArea.append(message);
+      if (textArea == null) {
+        // just ignore any events logged before the area is available
+        return;
+      }
+  
+      final String message = ((StringLayout) getLayout()).toSerializable(event);
+      SwingUtilities.invokeLater(() -> {
+        textArea.append(message);
+      });
     } finally {
       readLock.unlock();
     }
diff --git a/lucene/luke/src/java/org/apache/lucene/luke/util/LoggerFactory.java b/lucene/luke/src/java/org/apache/lucene/luke/util/LoggerFactory.java
index 4a383b1..c98d552 100644
--- a/lucene/luke/src/java/org/apache/lucene/luke/util/LoggerFactory.java
+++ b/lucene/luke/src/java/org/apache/lucene/luke/util/LoggerFactory.java
@@ -17,6 +17,8 @@
 
 package org.apache.lucene.luke.util;
 
+import java.nio.charset.StandardCharsets;
+
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
@@ -35,19 +37,20 @@ import org.apache.lucene.luke.app.desktop.util.TextAreaAppender;
  */
 public class LoggerFactory {
 
-  public static void initGuiLogging() {
+  public static void initGuiLogging(String logFile) {
     ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
     builder.add(builder.newRootLogger(Level.INFO));
     LoggerContext context = Configurator.initialize(builder.build());
 
     PatternLayout layout = PatternLayout.newBuilder()
         .withPattern("[%d{ISO8601}] %5p (%F:%L) - %m%n")
+        .withCharset(StandardCharsets.UTF_8)
         .build();
 
     Appender fileAppender = FileAppender.newBuilder()
         .setName("File")
         .setLayout(layout)
-        .withFileName(System.getProperty("user.home") + "/.luke.d/luke.log")
+        .withFileName(logFile)
         .withAppend(false)
           .build();
     fileAppender.start();