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