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 |
- |
|
|