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

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

Return to bug 60687