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    }