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 015package org.apache.tapestry5.internal.plastic; 016 017import org.apache.tapestry5.plastic.MethodDescription; 018import 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") 025public 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}