1 16 package com.google.gwt.junit.viewer.server; 17 18 import com.google.gwt.junit.viewer.client.Benchmark; 19 import com.google.gwt.junit.viewer.client.BrowserInfo; 20 import com.google.gwt.junit.viewer.client.Category; 21 import com.google.gwt.junit.viewer.client.Report; 22 import com.google.gwt.junit.viewer.client.Result; 23 import com.google.gwt.junit.viewer.client.Trial; 24 25 import org.jfree.chart.ChartFactory; 26 import org.jfree.chart.JFreeChart; 27 import org.jfree.chart.encoders.EncoderUtil; 28 import org.jfree.chart.encoders.ImageFormat; 29 import org.jfree.chart.plot.PlotOrientation; 30 import org.jfree.data.category.DefaultCategoryDataset; 31 import org.jfree.data.xy.XYSeries; 32 import org.jfree.data.xy.XYSeriesCollection; 33 34 import java.awt.Font ; 35 import java.awt.image.BufferedImage ; 36 import java.io.ByteArrayInputStream ; 37 import java.io.IOException ; 38 import java.io.InputStream ; 39 import java.io.OutputStream ; 40 import java.net.URLDecoder ; 41 import java.util.ArrayList ; 42 import java.util.HashMap ; 43 import java.util.Iterator ; 44 import java.util.List ; 45 import java.util.Map ; 46 import java.util.Set ; 47 import java.util.TreeMap ; 48 import java.util.TreeSet ; 49 50 import javax.servlet.ServletException ; 51 import javax.servlet.http.HttpServlet ; 52 import javax.servlet.http.HttpServletRequest ; 53 import javax.servlet.http.HttpServletResponse ; 54 55 78 public class ReportImageServer extends HttpServlet { 79 80 private static final String charset = "UTF-8"; 81 82 private static void copy(InputStream in, OutputStream out) throws IOException { 83 byte[] buf = new byte[512]; 84 85 while (true) { 86 int bytesRead = in.read(buf); 87 if (bytesRead == -1) { 88 break; 89 } 90 out.write(buf, 0, bytesRead); 91 } 92 } 93 94 private JFreeChart createChart(String testName, Result result, String title) { 95 96 List trials = result.getTrials(); 100 Trial firstTrial = (Trial) trials.get(0); 101 102 int numVariables = firstTrial.getVariables().size(); 107 108 String domainVariable = null; 109 String seriesVariable = null; 110 111 Map variableValues = null; 112 113 if (numVariables == 1) { 114 domainVariable = (String ) firstTrial.getVariables().keySet().iterator().next(); 115 } else { 116 121 variableValues = new HashMap (); 122 123 for (int i = 0; i < trials.size(); ++i) { 124 Trial trial = (Trial) trials.get(i); 125 Map variables = trial.getVariables(); 126 127 for (Iterator it = variables.entrySet().iterator(); it.hasNext();) { 128 Map.Entry entry = (Map.Entry ) it.next(); 129 String variable = (String ) entry.getKey(); 130 String value = (String ) entry.getValue(); 131 Set set = (Set ) variableValues.get(variable); 132 if (set == null) { 133 set = new TreeSet (); 134 variableValues.put(variable, set); 135 } 136 set.add(value); 137 } 138 } 139 140 TreeMap numValuesMap = new TreeMap (); 141 142 for (Iterator it = variableValues.entrySet().iterator(); it.hasNext();) { 143 Map.Entry entry = (Map.Entry ) it.next(); 144 String variable = (String ) entry.getKey(); 145 Set values = (Set ) entry.getValue(); 146 Integer numValues = new Integer (values.size()); 147 List variables = (List ) numValuesMap.get(numValues); 148 if (variables == null) { 149 variables = new ArrayList (); 150 numValuesMap.put(numValues, variables); 151 } 152 variables.add(variable); 153 } 154 155 if (numValuesMap.values().size() > 0) { 156 domainVariable = (String ) ((List ) numValuesMap.get(numValuesMap.lastKey())).get(0); 157 seriesVariable = (String ) ((List ) numValuesMap.get(numValuesMap.firstKey())).get(0); 158 } 159 } 160 161 String valueTitle = "time (ms)"; 163 if (numVariables == 0) { 164 Trial trial = (Trial) trials.iterator().next(); 167 168 DefaultCategoryDataset data = new DefaultCategoryDataset(); 169 data.addValue(trial.getRunTimeMillis(), "result", "result"); 170 171 return ChartFactory.createBarChart(title, testName, valueTitle, data, 172 PlotOrientation.VERTICAL, false, false, false); 173 } else if (numVariables == 1) { 174 175 180 XYSeriesCollection data = new XYSeriesCollection(); 181 182 XYSeries series = new XYSeries(domainVariable); 183 184 for (Iterator it = trials.iterator(); it.hasNext();) { 185 Trial trial = (Trial) it.next(); 186 if (trial.getException() != null) { 187 continue; 188 } 189 double time = trial.getRunTimeMillis(); 190 String domainValue = (String ) trial.getVariables().get(domainVariable); 191 series.add(Double.parseDouble(domainValue), time); 192 } 193 194 data.addSeries(series); 195 196 return ChartFactory.createXYLineChart(title, domainVariable, valueTitle, 197 data, PlotOrientation.VERTICAL, false, false, false); 198 } else if (numVariables == 2) { 199 XYSeriesCollection data = new XYSeriesCollection(); 201 202 Set seriesValues = (Set ) variableValues.get(seriesVariable); 203 204 for (Iterator it = seriesValues.iterator(); it.hasNext();) { 205 String seriesValue = (String ) it.next(); 206 XYSeries series = new XYSeries(seriesValue); 207 208 for (Iterator trialsIt = trials.iterator(); trialsIt.hasNext();) { 209 Trial trial = (Trial) trialsIt.next(); 210 if (trial.getException() != null) { 211 continue; 212 } 213 Map variables = trial.getVariables(); 214 if (variables.get(seriesVariable).equals(seriesValue)) { 215 double time = trial.getRunTimeMillis(); 216 String domainValue = (String ) trial.getVariables().get( 217 domainVariable); 218 series.add(Double.parseDouble(domainValue), time); 219 } 220 } 221 data.addSeries(series); 222 } 223 224 return ChartFactory.createXYLineChart(title, domainVariable, valueTitle, 225 data, PlotOrientation.VERTICAL, true, true, false); 226 } 227 228 return null; 229 230 234 251 252 270 } 271 272 public void doGet(HttpServletRequest request, HttpServletResponse response) 273 throws ServletException , IOException { 274 handleRequest(request, response); 275 } 276 277 public void doPost(HttpServletRequest request, HttpServletResponse response) 278 throws ServletException , IOException { 279 handleRequest(request, response); 280 } 281 282 private Benchmark getBenchmarkByName(List benchmarks, String name) { 283 for (Iterator it = benchmarks.iterator(); it.hasNext();) { 284 Benchmark benchmark = (Benchmark) it.next(); 285 if (benchmark.getName().equals(name)) { 286 return benchmark; 287 } 288 } 289 return null; 290 } 291 292 private Category getCategoryByName(List categories, String categoryName) { 293 for (Iterator catIt = categories.iterator(); catIt.hasNext();) { 294 Category category = (Category) catIt.next(); 295 if (category.getName().equals(categoryName)) { 296 return category; 297 } 298 } 299 return null; 300 } 301 302 private Result getResultsByAgent(List results, String agent) { 303 for (Iterator it = results.iterator(); it.hasNext();) { 304 Result result = (Result) it.next(); 305 if (result.getAgent().equals(agent)) { 306 return result; 307 } 308 } 309 return null; 310 } 311 312 private void handleRequest(HttpServletRequest request, 313 HttpServletResponse response) throws IOException , ServletException { 314 315 String uri = request.getRequestURI(); 316 String requestString = uri.split("test_images/")[1]; 317 String [] requestParams = requestString.split("/"); 318 319 String reportName = URLDecoder.decode(requestParams[0], charset); 320 String categoryName = URLDecoder.decode(requestParams[1], charset); 321 String className = URLDecoder.decode(requestParams[2], charset); 322 String testName = URLDecoder.decode(requestParams[3], charset); 323 String agent = URLDecoder.decode(requestParams[4], charset); 324 325 ReportDatabase db = ReportDatabase.getInstance(); 326 Report report = db.getReport(reportName); 327 List categories = report.getCategories(); 328 Category category = getCategoryByName(categories, categoryName); 329 List benchmarks = category.getBenchmarks(); 330 Benchmark benchmark = getBenchmarkByName(benchmarks, testName); 331 List results = benchmark.getResults(); 332 Result result = getResultsByAgent(results, agent); 333 334 String title = BrowserInfo.getBrowser(agent); 335 JFreeChart chart = null; 336 337 try { 338 chart = createChart(testName, result, title); 339 340 if (chart == null) { 341 super.doGet(request, response); 342 return; 343 } 344 } catch (Exception e) { 345 e.printStackTrace(); 346 } 347 348 chart.getTitle().setFont(Font.decode("Arial")); 349 350 final int graphWidth = Math.max(240, Math.min(480, 353 (1024 - 10 * results.size()) / results.size())); 354 BufferedImage img = chart.createBufferedImage(graphWidth, 240); 355 byte[] image = EncoderUtil.encode(img, ImageFormat.PNG); 356 357 response.setContentType("image/png"); 358 359 OutputStream output = response.getOutputStream(); 360 copy(new ByteArrayInputStream (image), output); 361 } 362 } 363 | Popular Tags |