142627b850c8f68a594f105e04b97c512b292b698Ben Gruver/* 242627b850c8f68a594f105e04b97c512b292b698Ben Gruver * Copyright 2013, Google Inc. 342627b850c8f68a594f105e04b97c512b292b698Ben Gruver * All rights reserved. 442627b850c8f68a594f105e04b97c512b292b698Ben Gruver * 542627b850c8f68a594f105e04b97c512b292b698Ben Gruver * Redistribution and use in source and binary forms, with or without 642627b850c8f68a594f105e04b97c512b292b698Ben Gruver * modification, are permitted provided that the following conditions are 742627b850c8f68a594f105e04b97c512b292b698Ben Gruver * met: 842627b850c8f68a594f105e04b97c512b292b698Ben Gruver * 942627b850c8f68a594f105e04b97c512b292b698Ben Gruver * * Redistributions of source code must retain the above copyright 1042627b850c8f68a594f105e04b97c512b292b698Ben Gruver * notice, this list of conditions and the following disclaimer. 1142627b850c8f68a594f105e04b97c512b292b698Ben Gruver * * Redistributions in binary form must reproduce the above 1242627b850c8f68a594f105e04b97c512b292b698Ben Gruver * copyright notice, this list of conditions and the following disclaimer 1342627b850c8f68a594f105e04b97c512b292b698Ben Gruver * in the documentation and/or other materials provided with the 1442627b850c8f68a594f105e04b97c512b292b698Ben Gruver * distribution. 1542627b850c8f68a594f105e04b97c512b292b698Ben Gruver * * Neither the name of Google Inc. nor the names of its 1642627b850c8f68a594f105e04b97c512b292b698Ben Gruver * contributors may be used to endorse or promote products derived from 1742627b850c8f68a594f105e04b97c512b292b698Ben Gruver * this software without specific prior written permission. 1842627b850c8f68a594f105e04b97c512b292b698Ben Gruver * 1942627b850c8f68a594f105e04b97c512b292b698Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2042627b850c8f68a594f105e04b97c512b292b698Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2142627b850c8f68a594f105e04b97c512b292b698Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2242627b850c8f68a594f105e04b97c512b292b698Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2342627b850c8f68a594f105e04b97c512b292b698Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2442627b850c8f68a594f105e04b97c512b292b698Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2542627b850c8f68a594f105e04b97c512b292b698Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2642627b850c8f68a594f105e04b97c512b292b698Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2742627b850c8f68a594f105e04b97c512b292b698Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2842627b850c8f68a594f105e04b97c512b292b698Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2942627b850c8f68a594f105e04b97c512b292b698Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3042627b850c8f68a594f105e04b97c512b292b698Ben Gruver */ 3142627b850c8f68a594f105e04b97c512b292b698Ben Gruver 3242627b850c8f68a594f105e04b97c512b292b698Ben Gruverpackage org.jf.dexlib2.writer.builder; 3342627b850c8f68a594f105e04b97c512b292b698Ben Gruver 3442627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport com.google.common.collect.Maps; 3542627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport org.jf.dexlib2.writer.DexWriter; 3642627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport org.jf.dexlib2.writer.TypeSection; 3742627b850c8f68a594f105e04b97c512b292b698Ben Gruver 3842627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport javax.annotation.Nonnull; 3942627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport javax.annotation.Nullable; 4042627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport java.util.Collection; 4142627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport java.util.Map.Entry; 4242627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport java.util.concurrent.ConcurrentMap; 4342627b850c8f68a594f105e04b97c512b292b698Ben Gruver 4442627b850c8f68a594f105e04b97c512b292b698Ben Gruverclass BuilderTypePool implements TypeSection<BuilderStringReference, BuilderTypeReference, BuilderTypeReference> { 4542627b850c8f68a594f105e04b97c512b292b698Ben Gruver @Nonnull private final BuilderContext context; 4642627b850c8f68a594f105e04b97c512b292b698Ben Gruver @Nonnull private final ConcurrentMap<String, BuilderTypeReference> internedItems = Maps.newConcurrentMap(); 4742627b850c8f68a594f105e04b97c512b292b698Ben Gruver 4842627b850c8f68a594f105e04b97c512b292b698Ben Gruver BuilderTypePool(@Nonnull BuilderContext context) { 4942627b850c8f68a594f105e04b97c512b292b698Ben Gruver this.context = context; 5042627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 5142627b850c8f68a594f105e04b97c512b292b698Ben Gruver 5242627b850c8f68a594f105e04b97c512b292b698Ben Gruver @Nonnull public BuilderTypeReference internType(@Nonnull String type) { 5342627b850c8f68a594f105e04b97c512b292b698Ben Gruver BuilderTypeReference ret = internedItems.get(type); 5442627b850c8f68a594f105e04b97c512b292b698Ben Gruver if (ret != null) { 5542627b850c8f68a594f105e04b97c512b292b698Ben Gruver return ret; 5642627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 5742627b850c8f68a594f105e04b97c512b292b698Ben Gruver BuilderStringReference stringRef = context.stringPool.internString(type); 5842627b850c8f68a594f105e04b97c512b292b698Ben Gruver BuilderTypeReference typeReference = new BuilderTypeReference(stringRef); 5942627b850c8f68a594f105e04b97c512b292b698Ben Gruver ret = internedItems.putIfAbsent(type, typeReference); 6042627b850c8f68a594f105e04b97c512b292b698Ben Gruver return ret==null?typeReference:ret; 6142627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 6242627b850c8f68a594f105e04b97c512b292b698Ben Gruver 6342627b850c8f68a594f105e04b97c512b292b698Ben Gruver @Nullable public BuilderTypeReference internNullableType(@Nullable String type) { 6442627b850c8f68a594f105e04b97c512b292b698Ben Gruver if (type == null) { 6542627b850c8f68a594f105e04b97c512b292b698Ben Gruver return null; 6642627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 6742627b850c8f68a594f105e04b97c512b292b698Ben Gruver return internType(type); 6842627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 6942627b850c8f68a594f105e04b97c512b292b698Ben Gruver 7042627b850c8f68a594f105e04b97c512b292b698Ben Gruver @Nonnull @Override public BuilderStringReference getString(@Nonnull BuilderTypeReference key) { 7142627b850c8f68a594f105e04b97c512b292b698Ben Gruver return key.stringReference; 7242627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 7342627b850c8f68a594f105e04b97c512b292b698Ben Gruver 7442627b850c8f68a594f105e04b97c512b292b698Ben Gruver @Override public int getNullableItemIndex(@Nullable BuilderTypeReference key) { 7542627b850c8f68a594f105e04b97c512b292b698Ben Gruver return key==null?DexWriter.NO_INDEX:key.index; 7642627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 7742627b850c8f68a594f105e04b97c512b292b698Ben Gruver 7842627b850c8f68a594f105e04b97c512b292b698Ben Gruver @Override public int getItemIndex(@Nonnull BuilderTypeReference key) { 7942627b850c8f68a594f105e04b97c512b292b698Ben Gruver return key.getIndex(); 8042627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 8142627b850c8f68a594f105e04b97c512b292b698Ben Gruver 8242627b850c8f68a594f105e04b97c512b292b698Ben Gruver @Nonnull @Override public Collection<? extends Entry<? extends BuilderTypeReference, Integer>> getItems() { 8342627b850c8f68a594f105e04b97c512b292b698Ben Gruver return new BuilderMapEntryCollection<BuilderTypeReference>(internedItems.values()) { 8442627b850c8f68a594f105e04b97c512b292b698Ben Gruver @Override protected int getValue(@Nonnull BuilderTypeReference key) { 8542627b850c8f68a594f105e04b97c512b292b698Ben Gruver return key.index; 8642627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 8742627b850c8f68a594f105e04b97c512b292b698Ben Gruver 8842627b850c8f68a594f105e04b97c512b292b698Ben Gruver @Override protected int setValue(@Nonnull BuilderTypeReference key, int value) { 8942627b850c8f68a594f105e04b97c512b292b698Ben Gruver int prev = key.index; 9042627b850c8f68a594f105e04b97c512b292b698Ben Gruver key.index = value; 9142627b850c8f68a594f105e04b97c512b292b698Ben Gruver return prev; 9242627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 9342627b850c8f68a594f105e04b97c512b292b698Ben Gruver }; 9442627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 9542627b850c8f68a594f105e04b97c512b292b698Ben Gruver} 96