View | Details | Raw Unified | Return to bug 60687
Collapse All | Expand All

(-)a/src/core/org/apache/jmeter/gui/LoggerPanel.java (-14 / +46 lines)
Lines 20-32 package org.apache.jmeter.gui; Link Here
20
20
21
import java.awt.BorderLayout;
21
import java.awt.BorderLayout;
22
import java.awt.Insets;
22
import java.awt.Insets;
23
import java.util.Iterator;
23
24
24
import javax.swing.JPanel;
25
import javax.swing.JPanel;
25
import javax.swing.JScrollPane;
26
import javax.swing.JScrollPane;
26
import javax.swing.JTextArea;
27
import javax.swing.JTextArea;
27
import javax.swing.ScrollPaneConstants;
28
import javax.swing.ScrollPaneConstants;
28
import javax.swing.SwingUtilities;
29
import javax.swing.SwingUtilities;
30
import javax.swing.Timer;
29
31
32
import org.apache.commons.collections.buffer.BoundedFifoBuffer;
30
import org.apache.jmeter.gui.util.JSyntaxTextArea;
33
import org.apache.jmeter.gui.util.JSyntaxTextArea;
31
import org.apache.jmeter.gui.util.JTextScrollPane;
34
import org.apache.jmeter.gui.util.JTextScrollPane;
32
import org.apache.jmeter.util.JMeterUtils;
35
import org.apache.jmeter.util.JMeterUtils;
Lines 45-56 public class LoggerPanel extends JPanel implements LogTarget { Link Here
45
48
46
    private final JTextArea textArea;
49
    private final JTextArea textArea;
47
50
51
    private final BoundedFifoBuffer events =
52
            new BoundedFifoBuffer(JMeterUtils.getPropDefault("jmeter.loggerpanel.maxlength", 1000)); // $NON-NLS-1$
53
54
    private Timer timer;
55
56
    private volatile boolean logChanged = false;
57
48
    private final PatternFormatter format;
58
    private final PatternFormatter format;
49
59
50
    // Limit length of log content
60
    // Limit length of log content
51
    private static final int LOGGER_PANEL_MAX_LENGTH =
61
    private static final int LOGGER_PANEL_MAX_LENGTH =
52
            JMeterUtils.getPropDefault("jmeter.loggerpanel.maxlength", 80000); // $NON-NLS-1$
62
            JMeterUtils.getPropDefault("jmeter.loggerpanel.maxlength", 80000); // $NON-NLS-1$
53
    
63
54
    // Make panel handle event even if closed
64
    // Make panel handle event even if closed
55
    private static final boolean LOGGER_PANEL_RECEIVE_WHEN_CLOSED =
65
    private static final boolean LOGGER_PANEL_RECEIVE_WHEN_CLOSED =
56
            JMeterUtils.getPropDefault("jmeter.loggerpanel.enable_when_closed", true); // $NON-NLS-1$
66
            JMeterUtils.getPropDefault("jmeter.loggerpanel.enable_when_closed", true); // $NON-NLS-1$
Lines 89-94 public class LoggerPanel extends JPanel implements LogTarget { Link Here
89
        areaScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
99
        areaScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
90
        areaScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
100
        areaScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
91
        this.add(areaScrollPane, BorderLayout.CENTER);
101
        this.add(areaScrollPane, BorderLayout.CENTER);
102
103
        initWorker();
104
92
        return jTextArea;
105
        return jTextArea;
93
    }
106
    }
94
107
Lines 100-121 public class LoggerPanel extends JPanel implements LogTarget { Link Here
100
        if(!LOGGER_PANEL_RECEIVE_WHEN_CLOSED && !GuiPackage.getInstance().getMenuItemLoggerPanel().getModel().isSelected()) {
113
        if(!LOGGER_PANEL_RECEIVE_WHEN_CLOSED && !GuiPackage.getInstance().getMenuItemLoggerPanel().getModel().isSelected()) {
101
            return;
114
            return;
102
        }
115
        }
103
        
116
104
        SwingUtilities.invokeLater(new Runnable() {
117
        synchronized (events) {
105
            @Override
118
            if (events.isFull()) {
106
            public void run() {
119
                events.remove();
107
                synchronized (textArea) {
120
            }
108
                    textArea.append(format.format(logEvent));
121
            events.add(format.format(logEvent));
109
                    int currentLength = textArea.getText().length();
122
        }
110
                    // If LOGGER_PANEL_MAX_LENGTH is 0, it means all log events are kept
123
111
                    if(LOGGER_PANEL_MAX_LENGTH != 0 && currentLength> LOGGER_PANEL_MAX_LENGTH) {
124
        logChanged = true;
112
                        textArea.setText(textArea.getText().substring(Math.max(0, currentLength-LOGGER_PANEL_MAX_LENGTH), 
125
    }
113
                                currentLength));
126
127
    private void initWorker() {
128
        timer = new Timer(
129
            100,
130
            e -> {
131
                if (logChanged) {
132
                    logChanged = false;
133
                    StringBuilder builder = new StringBuilder();
134
                    synchronized (events) {
135
                        Iterator<String> lines = events.iterator();
136
                        while (lines.hasNext()) {
137
                            builder.append(lines.next());
138
                        }
139
                    }
140
                    String logText = builder.toString();
141
                    synchronized (textArea) {
142
                        textArea.setText(logText);
143
                        int currentLength = logText.length();
144
                        textArea.setCaretPosition(logText.length());
114
                    }
145
                    }
115
                    textArea.setCaretPosition(textArea.getText().length());
116
                }
146
                }
117
            }
147
            }
118
        });
148
        );
149
        timer.start();
119
    }
150
    }
120
151
121
    /**
152
    /**
Lines 123-127 public class LoggerPanel extends JPanel implements LogTarget { Link Here
123
     */
154
     */
124
    public void clear() {
155
    public void clear() {
125
        this.textArea.setText(""); // $NON-NLS-1$
156
        this.textArea.setText(""); // $NON-NLS-1$
157
        events.clear();
126
    }
158
    }
127
}
159
}

Return to bug 60687