001    // Copyright 2011 The Apache Software Foundation
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    // http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    
015    package org.apache.tapestry5.internal.plastic;
016    
017    import org.apache.tapestry5.plastic.MethodDescription;
018    import org.apache.tapestry5.plastic.PlasticUtils;
019    
020    /**
021     * A cache of translations from type names to internal names and descriptors, as well as a cache from MethodDescription
022     * to method descriptor.
023     */
024    @SuppressWarnings("rawtypes")
025    public class NameCache
026    {
027        private final Cache<String, String> class2internal = new Cache<String, String>()
028        {
029    
030            @Override
031            protected String convert(String className)
032            {
033                return PlasticInternalUtils.toInternalName(className);
034            }
035        };
036    
037        private final Cache<Class, String> type2internal = new Cache<Class, String>()
038        {
039            @Override
040            protected String convert(Class input)
041            {
042                return toInternalName(input.getName());
043            }
044        };
045    
046        private final Cache<MethodDescription, String> md2desc = new Cache<MethodDescription, String>()
047        {
048            @Override
049            protected String convert(MethodDescription methodDescription)
050            {
051                return toMethodDescriptor(methodDescription.returnType, methodDescription.argumentTypes);
052            }
053        };
054    
055        private final Cache<String, String> type2desc = new Cache<String, String>()
056        {
057            @Override
058            protected String convert(String typeName)
059            {
060                return PlasticInternalUtils.toDescriptor(typeName);
061            }
062        };
063    
064        private final Cache<Class, String> typeToTypeName = new Cache<Class, String>()
065        {
066            @Override
067            protected String convert(Class type)
068            {
069                return PlasticUtils.toTypeName(type);
070            }
071        };
072    
073        public String toInternalName(String className)
074        {
075            return class2internal.get(className);
076        }
077    
078        public String toInternalName(Class type)
079        {
080            return type2internal.get(type);
081        }
082    
083        public String toDesc(MethodDescription md)
084        {
085            return md2desc.get(md);
086        }
087    
088        public String toDesc(String typeName)
089        {
090            return type2desc.get(typeName);
091        }
092    
093        public String toTypeName(Class type)
094        {
095            return typeToTypeName.get(type);
096        }
097    
098        public String[] toTypeNames(Class... types)
099        {
100            String[] result = new String[types.length];
101    
102            for (int i = 0; i < result.length; i++)
103                result[i] = toTypeName(types[i]);
104    
105            return result;
106        }
107    
108        public String toMethodDescriptor(Class returnType, Class... argumentTypes)
109        {
110            return toMethodDescriptor(toTypeName(returnType), toTypeNames(argumentTypes));
111        }
112    
113        public String toMethodDescriptor(String returnType, String... argumentTypes)
114        {
115            StringBuilder builder = new StringBuilder("(");
116    
117            for (String argumentType : argumentTypes)
118            {
119                builder.append(toDesc(argumentType));
120            }
121    
122            builder.append(")").append(toDesc(returnType));
123    
124            return builder.toString();
125        }
126    }