001 /*** 002 * 003 * Copyright (c) 2007 Paul Hammant 004 * All rights reserved. 005 * 006 * Redistribution and use in source and binary forms, with or without 007 * modification, are permitted provided that the following conditions 008 * are met: 009 * 1. Redistributions of source code must retain the above copyright 010 * notice, this list of conditions and the following disclaimer. 011 * 2. Redistributions in binary form must reproduce the above copyright 012 * notice, this list of conditions and the following disclaimer in the 013 * documentation and/or other materials provided with the distribution. 014 * 3. Neither the name of the copyright holders nor the names of its 015 * contributors may be used to endorse or promote products derived from 016 * this software without specific prior written permission. 017 * 018 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 019 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 020 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 021 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 022 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 023 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 024 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 025 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 026 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 027 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 028 * THE POSSIBILITY OF SUCH DAMAGE. 029 */ 030 031 package com.thoughtworks.paranamer; 032 033 import com.thoughtworks.paranamer.BytecodeReadingParanamer; 034 035 import java.lang.reflect.AccessibleObject; 036 import java.util.WeakHashMap; 037 038 /** 039 * Implementation of Paranamer which delegate to another Paranamer implementation, adding caching functionality. 040 * 041 * @author Paul Hammant 042 * @author Mauro Talevi 043 */ 044 public class CachingParanamer implements Paranamer { 045 046 public static final String __PARANAMER_DATA = "v1.0 \n" 047 + "com.thoughtworks.paranamer.CachingParanamer CachingParanamer \n" 048 + "com.thoughtworks.paranamer.CachingParanamer CachingParanamer com.thoughtworks.paranamer.Paranamer delegate \n" 049 + "com.thoughtworks.paranamer.CachingParanamer toString \n" 050 + "com.thoughtworks.paranamer.CachingParanamer lookupParameterNames java.lang.AccessibleObject methodOrCtor \n"; 051 052 private Paranamer delegate; 053 private final WeakHashMap methodCache = new WeakHashMap(); 054 055 public CachingParanamer() { 056 this(new DefaultParanamer()); 057 } 058 059 public CachingParanamer(Paranamer delegate) { 060 this.delegate = delegate; 061 } 062 063 /** 064 * @Deperecated Use 'new CachingParanamer(new AdaptiveParanamer())' instead. 065 */ 066 public void switchtoAsm() { 067 delegate = new BytecodeReadingParanamer(); 068 } 069 070 public String[] lookupParameterNames(AccessibleObject methodOrConstructor) { 071 return lookupParameterNames(methodOrConstructor, true); 072 } 073 074 public String[] lookupParameterNames(AccessibleObject methodOrCtor, boolean throwExceptionIfMissing) { 075 if(methodCache.containsKey(methodOrCtor)) { 076 return (String[]) methodCache.get(methodOrCtor); 077 } 078 079 String[] names = delegate.lookupParameterNames(methodOrCtor, throwExceptionIfMissing); 080 methodCache.put(methodOrCtor, names); 081 082 return names; 083 } 084 085 /** 086 * @Deperecated Use 'new CachingParanamer(new AdaptiveParanamer())' instead. 087 */ 088 public int areParameterNamesAvailable(Class clazz, String ctorOrMethodName) { 089 return delegate.areParameterNamesAvailable(clazz, ctorOrMethodName); 090 } 091 092 public String toString() { 093 return new StringBuffer("[CachingParanamer delegate=") 094 .append(delegate).append("]").toString(); 095 } 096 097 }