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

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

Return to bug 60687