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 19cda4f2e72f569e0a0d6119c1c75284fd44df79abRichard Uhlerimport com.android.ahat.heapdump.AhatHeap; 20cda4f2e72f569e0a0d6119c1c75284fd44df79abRichard Uhlerimport com.android.ahat.heapdump.AhatInstance; 21cda4f2e72f569e0a0d6119c1c75284fd44df79abRichard Uhlerimport com.android.ahat.heapdump.AhatSnapshot; 22f629cfdbf6da3409aff177352e9ff41209b4570cRichard Uhlerimport com.android.ahat.heapdump.Sort; 23b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport java.util.ArrayList; 24b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport java.util.Collection; 25b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport java.util.Collections; 26b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerimport java.util.List; 27b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 28b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler/** 29b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * Class for rendering a list of instances dominated by a single instance in a 30b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * pretty way. 31b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler */ 32b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhlerclass DominatedList { 33b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler /** 34b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * Render a table to the given HtmlWriter showing a pretty list of 35b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * instances. 36b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler * 371af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler * @param snapshot the snapshot where the instances reside 381af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler * @param doc the document to render the dominated list to 391af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler * @param query the current page query 401af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler * @param id a unique identifier to use for the dominated list in the current page 411af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler * @param instances the collection of instances to generate a list for 42b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler */ 431af86f17dc9a47faf1c6cd7ccd23d248fdc615abRichard Uhler public static void render(final AhatSnapshot snapshot, 44cda4f2e72f569e0a0d6119c1c75284fd44df79abRichard Uhler Doc doc, Query query, String id, Collection<AhatInstance> instances) { 45cda4f2e72f569e0a0d6119c1c75284fd44df79abRichard Uhler List<AhatInstance> insts = new ArrayList<AhatInstance>(instances); 46b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler Collections.sort(insts, Sort.defaultInstanceCompare(snapshot)); 47cda4f2e72f569e0a0d6119c1c75284fd44df79abRichard Uhler HeapTable.render(doc, query, id, new TableConfig(), snapshot, insts); 48b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 49b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 50cda4f2e72f569e0a0d6119c1c75284fd44df79abRichard Uhler private static class TableConfig implements HeapTable.TableConfig<AhatInstance> { 51b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler @Override 52b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler public String getHeapsDescription() { 53b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler return "Bytes Retained by Heap"; 54b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 55b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 56b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler @Override 57cda4f2e72f569e0a0d6119c1c75284fd44df79abRichard Uhler public long getSize(AhatInstance element, AhatHeap heap) { 58cda4f2e72f569e0a0d6119c1c75284fd44df79abRichard Uhler return element.getRetainedSize(heap); 59b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 60b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 61b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler @Override 62cda4f2e72f569e0a0d6119c1c75284fd44df79abRichard Uhler public List<HeapTable.ValueConfig<AhatInstance>> getValueConfigs() { 63cda4f2e72f569e0a0d6119c1c75284fd44df79abRichard Uhler HeapTable.ValueConfig<AhatInstance> value = new HeapTable.ValueConfig<AhatInstance>() { 64b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler public String getDescription() { 65b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler return "Object"; 66b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 67b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler 68cda4f2e72f569e0a0d6119c1c75284fd44df79abRichard Uhler public DocString render(AhatInstance element) { 69cda4f2e72f569e0a0d6119c1c75284fd44df79abRichard Uhler return Summarizer.summarize(element); 70b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 71b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler }; 72b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler return Collections.singletonList(value); 73b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 74b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler } 75b730b78dac047c6d8ead93ad77605bcb7414f5ceRichard Uhler} 76