001// Copyright 2004, 2005 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.hivemind.impl;
016
017import java.util.HashMap;
018import java.util.Map;
019
020/**
021 * Holds a utility method that converts java type names (as they might appear in source code) into
022 * JVM class names.
023 * 
024 * @author Howard M. Lewis Ship
025 * @since 1.1
026 */
027public class JavaTypeUtils
028{
029    /**
030     * Mapping between a primitive type and its Java VM representation Used for the encoding of
031     * array types
032     */
033    private static Map PRIMITIVE_TYPE_CODES = new HashMap();
034
035    static
036    {
037        PRIMITIVE_TYPE_CODES.put("boolean", "Z");
038        PRIMITIVE_TYPE_CODES.put("short", "S");
039        PRIMITIVE_TYPE_CODES.put("int", "I");
040        PRIMITIVE_TYPE_CODES.put("long", "J");
041        PRIMITIVE_TYPE_CODES.put("float", "F");
042        PRIMITIVE_TYPE_CODES.put("double", "D");
043        PRIMITIVE_TYPE_CODES.put("char", "C");
044        PRIMITIVE_TYPE_CODES.put("byte", "B");
045    }
046
047    /**
048     * Map from Java type name to Class.
049     */
050    private static final Map PRIMITIVE_CLASSES = new HashMap();
051
052    static
053    {
054        PRIMITIVE_CLASSES.put("boolean", boolean.class);
055        PRIMITIVE_CLASSES.put("short", short.class);
056        PRIMITIVE_CLASSES.put("char", char.class);
057        PRIMITIVE_CLASSES.put("byte", byte.class);
058        PRIMITIVE_CLASSES.put("int", int.class);
059        PRIMITIVE_CLASSES.put("long", long.class);
060        PRIMITIVE_CLASSES.put("float", float.class);
061        PRIMITIVE_CLASSES.put("double", double.class);
062    }
063
064    private JavaTypeUtils()
065    {
066        // Prevent instantiation
067    }
068
069    /**
070     * Translates types from standard Java format to Java VM format. For example, java.util.Locale
071     * remains java.util.Locale, but int[][] is translated to [[I and java.lang.Object[] to
072     * [Ljava.lang.Object;
073     */
074    public static String getJVMClassName(String type)
075    {
076        // if it is not an array, just return the type itself
077        if (!type.endsWith("[]"))
078            return type;
079
080        // if it is an array, convert it to JavaVM-style format
081        StringBuffer buffer = new StringBuffer();
082
083        while (type.endsWith("[]"))
084        {
085            buffer.append("[");
086            type = type.substring(0, type.length() - 2);
087        }
088
089        String primitiveIdentifier = (String) PRIMITIVE_TYPE_CODES.get(type);
090        if (primitiveIdentifier != null)
091            buffer.append(primitiveIdentifier);
092        else
093        {
094            buffer.append("L");
095            buffer.append(type);
096            buffer.append(";");
097        }
098
099        return buffer.toString();
100    }
101
102    /**
103     * Translates a primitive type ("boolean", "char", etc.) to the corresponding
104     * Class.
105     * 
106     * @return the corresponding class, or null if type is not a primitive type.
107     * 
108     */
109    
110    public static Class getPrimtiveClass(String type)
111    {
112        return (Class) PRIMITIVE_CLASSES.get(type);
113    }
114}