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