1b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler/* 2b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * Copyright (C) 2015 The Android Open Source Project 3b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * 4b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * Licensed under the Apache License, Version 2.0 (the "License"); 5b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * you may not use this file except in compliance with the License. 6b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * You may obtain a copy of the License at 7b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * 8b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * http://www.apache.org/licenses/LICENSE-2.0 9b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * 10b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * Unless required by applicable law or agreed to in writing, software 11b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * distributed under the License is distributed on an "AS IS" BASIS, 12b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * See the License for the specific language governing permissions and 14b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * limitations under the License. 15b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler */ 16b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 17b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerpackage com.android.ahat; 18b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 19b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport com.android.tools.perflib.heap.Instance; 20b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport com.sun.net.httpserver.HttpExchange; 21b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport com.sun.net.httpserver.HttpHandler; 22b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport java.awt.image.BufferedImage; 23b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport java.io.IOException; 24b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport java.io.OutputStream; 25b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport java.io.PrintStream; 26b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport javax.imageio.ImageIO; 27b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 28b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerclass BitmapHandler implements HttpHandler { 29b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler private AhatSnapshot mSnapshot; 30b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 31b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler public BitmapHandler(AhatSnapshot snapshot) { 32b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler mSnapshot = snapshot; 33b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 34b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 35b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler @Override 36b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler public void handle(HttpExchange exchange) throws IOException { 37b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler try { 38b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler Query query = new Query(exchange.getRequestURI()); 39b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler long id = query.getLong("id", 0); 40b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler BufferedImage bitmap = null; 41b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler Instance inst = mSnapshot.findInstance(id); 42b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler if (inst != null) { 43b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler bitmap = InstanceUtils.asBitmap(inst); 44b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 45b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 46b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler if (bitmap != null) { 47b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler exchange.getResponseHeaders().add("Content-Type", "image/png"); 48b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler exchange.sendResponseHeaders(200, 0); 49b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler OutputStream os = exchange.getResponseBody(); 50b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler ImageIO.write(bitmap, "png", os); 51b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler os.close(); 52b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } else { 53b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler exchange.getResponseHeaders().add("Content-Type", "text/html"); 54b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler exchange.sendResponseHeaders(404, 0); 55b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler PrintStream ps = new PrintStream(exchange.getResponseBody()); 56b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler HtmlDoc doc = new HtmlDoc(ps, DocString.text("ahat"), DocString.uri("style.css")); 57b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler doc.big(DocString.text("No bitmap found for the given request.")); 58b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler doc.close(); 59b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 60b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } catch (RuntimeException e) { 61b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler // Print runtime exceptions to standard error for debugging purposes, 62b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler // because otherwise they are swallowed and not reported. 63b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler System.err.println("Exception when handling " + exchange.getRequestURI() + ": "); 64b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler e.printStackTrace(); 65b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler throw e; 66b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 67b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 68b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler} 69