Line 0
Link Here
|
|
|
1 |
/* |
2 |
* Licensed to the Apache Software Foundation (ASF) under one or more |
3 |
* contributor license agreements. See the NOTICE file distributed with |
4 |
* this work for additional information regarding copyright ownership. |
5 |
* The ASF licenses this file to You under the Apache License, Version 2.0 |
6 |
* (the "License"); you may not use this file except in compliance with |
7 |
* the License. You may obtain a copy of the License at |
8 |
* |
9 |
* http://www.apache.org/licenses/LICENSE-2.0 |
10 |
* |
11 |
* Unless required by applicable law or agreed to in writing, software |
12 |
* distributed under the License is distributed on an "AS IS" BASIS, |
13 |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
14 |
* implied. |
15 |
* |
16 |
* See the License for the specific language governing permissions and |
17 |
* limitations under the License. |
18 |
*/ |
19 |
|
20 |
package org.apache.jmeter.visualizers; |
21 |
|
22 |
import java.awt.BorderLayout; |
23 |
import java.awt.Dimension; |
24 |
|
25 |
import javafx.application.Platform; |
26 |
import javafx.beans.value.ChangeListener; |
27 |
import javafx.beans.value.ObservableValue; |
28 |
import javafx.concurrent.Worker.State; |
29 |
import javafx.embed.swing.JFXPanel; |
30 |
import javafx.event.EventHandler; |
31 |
import javafx.scene.Scene; |
32 |
import javafx.scene.web.WebEngine; |
33 |
import javafx.scene.web.WebEvent; |
34 |
import javafx.scene.web.WebView; |
35 |
|
36 |
import javax.swing.BorderFactory; |
37 |
import javax.swing.JLabel; |
38 |
import javax.swing.JOptionPane; |
39 |
import javax.swing.JPanel; |
40 |
import javax.swing.JProgressBar; |
41 |
import javax.swing.SwingUtilities; |
42 |
|
43 |
import org.apache.jmeter.samplers.SampleResult; |
44 |
import org.apache.jmeter.util.JMeterUtils; |
45 |
|
46 |
/** |
47 |
* {@link ResultRenderer} implementation that uses JAVAFX WebEngine to render as browser do |
48 |
*/ |
49 |
public class RenderInBrowser extends SamplerResultTab implements ResultRenderer { |
50 |
|
51 |
private final JFXPanel jfxPanel = new JFXPanel(); |
52 |
private WebEngine engine; |
53 |
private final JLabel lblStatus = new JLabel(); |
54 |
private final JProgressBar progressBar = new JProgressBar(); |
55 |
|
56 |
private JPanel browserPanel; |
57 |
|
58 |
/** {@inheritDoc} */ |
59 |
@Override |
60 |
public void renderResult(SampleResult sampleResult) { |
61 |
String response = ViewResultsFullVisualizer |
62 |
.getResponseAsString(sampleResult); |
63 |
showRenderedResponse(response, sampleResult); |
64 |
} |
65 |
|
66 |
protected void showRenderedResponse(String response, SampleResult res) { |
67 |
showRenderedResponse(response, res, false); |
68 |
} |
69 |
|
70 |
protected void showRenderedResponse(String response, SampleResult res, |
71 |
boolean embedded) { |
72 |
if (response == null) { |
73 |
results.setText(""); |
74 |
return; |
75 |
} |
76 |
|
77 |
int htmlIndex = response.indexOf("<HTML"); // could be <HTML lang=""> // |
78 |
// $NON-NLS-1$ |
79 |
|
80 |
// Look for a case variation |
81 |
if (htmlIndex < 0) { |
82 |
htmlIndex = response.indexOf("<html"); // ditto // $NON-NLS-1$ |
83 |
} |
84 |
|
85 |
// If we still can't find it, just try using all of the text |
86 |
if (htmlIndex < 0) { |
87 |
htmlIndex = 0; |
88 |
} |
89 |
|
90 |
final String html = response.substring(htmlIndex); |
91 |
|
92 |
if (browserPanel == null) { |
93 |
browserPanel = initComponents(html); |
94 |
} |
95 |
browserPanel.setVisible(true); |
96 |
resultsScrollPane.setViewportView(browserPanel); |
97 |
Platform.runLater(new Runnable() { |
98 |
@Override |
99 |
public void run() { |
100 |
engine.loadContent(html); |
101 |
} |
102 |
}); |
103 |
} |
104 |
|
105 |
private JPanel initComponents(String htmlContent) { |
106 |
createScene(htmlContent); |
107 |
|
108 |
progressBar.setPreferredSize(new Dimension(150, 18)); |
109 |
progressBar.setStringPainted(true); |
110 |
|
111 |
JPanel statusBar = new JPanel(new BorderLayout(5, 0)); |
112 |
statusBar.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5)); |
113 |
statusBar.add(lblStatus, BorderLayout.CENTER); |
114 |
statusBar.add(progressBar, BorderLayout.WEST); |
115 |
|
116 |
JPanel panel = new JPanel(new BorderLayout()); |
117 |
panel.setPreferredSize(new Dimension(1024, 600)); |
118 |
panel.add(statusBar, BorderLayout.NORTH); |
119 |
panel.add(jfxPanel, BorderLayout.CENTER); |
120 |
return panel; |
121 |
} |
122 |
|
123 |
private void createScene(final String htmlContent) { |
124 |
Platform.setImplicitExit(false); |
125 |
Platform.runLater(new Runnable() { |
126 |
@Override |
127 |
public void run() { |
128 |
|
129 |
WebView view = new WebView(); |
130 |
engine = view.getEngine(); |
131 |
|
132 |
engine.setOnStatusChanged(new EventHandler<WebEvent<String>>() { |
133 |
@Override |
134 |
public void handle(final WebEvent<String> event) { |
135 |
SwingUtilities.invokeLater(new Runnable() { |
136 |
@Override |
137 |
public void run() { |
138 |
lblStatus.setText(event.getData()); |
139 |
} |
140 |
}); |
141 |
} |
142 |
}); |
143 |
|
144 |
engine.getLoadWorker().workDoneProperty() |
145 |
.addListener(new ChangeListener<Number>() { |
146 |
@Override |
147 |
public void changed( |
148 |
ObservableValue<? extends Number> observableValue, |
149 |
Number oldValue, final Number newValue) { |
150 |
SwingUtilities.invokeLater(new Runnable() { |
151 |
@Override |
152 |
public void run() { |
153 |
progressBar.setValue(newValue |
154 |
.intValue()); |
155 |
} |
156 |
}); |
157 |
} |
158 |
}); |
159 |
|
160 |
engine.getLoadWorker().exceptionProperty() |
161 |
.addListener(new ChangeListener<Throwable>() { |
162 |
|
163 |
@Override |
164 |
public void changed( |
165 |
ObservableValue<? extends Throwable> o, |
166 |
Throwable old, final Throwable value) { |
167 |
if (engine.getLoadWorker().getState() == State.FAILED) { |
168 |
SwingUtilities.invokeLater(new Runnable() { |
169 |
@Override |
170 |
public void run() { |
171 |
JOptionPane |
172 |
.showMessageDialog( |
173 |
resultsScrollPane, |
174 |
(value != null) ? engine |
175 |
.getLocation() |
176 |
+ "\n" |
177 |
+ value.getMessage() |
178 |
: engine.getLocation() |
179 |
+ "\nUnexpected error.", |
180 |
"Loading error...", |
181 |
JOptionPane.ERROR_MESSAGE); |
182 |
} |
183 |
}); |
184 |
} |
185 |
} |
186 |
}); |
187 |
jfxPanel.setScene(new Scene(view)); |
188 |
} |
189 |
}); |
190 |
} |
191 |
|
192 |
/** {@inheritDoc} */ |
193 |
@Override |
194 |
public String toString() { |
195 |
return JMeterUtils.getResString("view_results_render_browser"); // $NON-NLS-1$ |
196 |
} |
197 |
|
198 |
} |