1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/*
2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *             of Java bytecode.
4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
52270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is free software; you can redistribute it and/or modify it
8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * under the terms of the GNU General Public License as published by the Free
9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Software Foundation; either version 2 of the License, or (at your option)
10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * any later version.
11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is distributed in the hope that it will be useful, but WITHOUT
13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * more details.
16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You should have received a copy of the GNU General Public License along
18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * with this program; if not, write to the Free Software Foundation, Inc.,
19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopackage proguard.classfile.util;
22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.*;
24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.util.List;
26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/**
28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Utility methods for converting between internal and external representations
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of names and descriptions.
30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class ClassUtil
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private static final String EMPTY_STRING = "";
36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Checks whether the given class magic number is correct.
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param magicNumber the magic number.
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @throws UnsupportedOperationException when the magic number is incorrect.
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static void checkMagicNumber(int magicNumber) throws UnsupportedOperationException
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (magicNumber != ClassConstants.MAGIC)
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            throw new UnsupportedOperationException("Invalid magic number ["+Integer.toHexString(magicNumber)+"] in class");
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the combined class version number.
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param majorVersion the major part of the class version number.
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param minorVersion the minor part of the class version number.
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the combined class version number.
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static int internalClassVersion(int majorVersion, int minorVersion)
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return (majorVersion << 16) | minorVersion;
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the major part of the given class version number.
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param classVersion the combined class version number.
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the major part of the class version number.
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static int internalMajorClassVersion(int classVersion)
70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return classVersion >>> 16;
72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the internal class version number.
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param classVersion the external class version number.
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the internal class version number.
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static int internalMinorClassVersion(int classVersion)
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return classVersion & 0xffff;
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the internal class version number.
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param classVersion the external class version number.
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the internal class version number.
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static int internalClassVersion(String classVersion)
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return
942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            classVersion.equals(JavaConstants.CLASS_VERSION_1_0)       ||
952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            classVersion.equals(JavaConstants.CLASS_VERSION_1_1)       ? ClassConstants.CLASS_VERSION_1_0 :
962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            classVersion.equals(JavaConstants.CLASS_VERSION_1_2)       ? ClassConstants.CLASS_VERSION_1_2 :
972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            classVersion.equals(JavaConstants.CLASS_VERSION_1_3)       ? ClassConstants.CLASS_VERSION_1_3 :
982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            classVersion.equals(JavaConstants.CLASS_VERSION_1_4)       ? ClassConstants.CLASS_VERSION_1_4 :
992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            classVersion.equals(JavaConstants.CLASS_VERSION_1_5_ALIAS) ||
1002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            classVersion.equals(JavaConstants.CLASS_VERSION_1_5)       ? ClassConstants.CLASS_VERSION_1_5 :
1012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            classVersion.equals(JavaConstants.CLASS_VERSION_1_6_ALIAS) ||
1022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            classVersion.equals(JavaConstants.CLASS_VERSION_1_6)       ? ClassConstants.CLASS_VERSION_1_6 :
1032270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            classVersion.equals(JavaConstants.CLASS_VERSION_1_7_ALIAS) ||
1042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            classVersion.equals(JavaConstants.CLASS_VERSION_1_7)       ? ClassConstants.CLASS_VERSION_1_7 :
1052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            classVersion.equals(JavaConstants.CLASS_VERSION_1_8_ALIAS) ||
1062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            classVersion.equals(JavaConstants.CLASS_VERSION_1_8)       ? ClassConstants.CLASS_VERSION_1_8 :
1072270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                                                         0;
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the minor part of the given class version number.
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param classVersion the combined class version number.
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the minor part of the class version number.
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalClassVersion(int classVersion)
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        switch (classVersion)
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
1202270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            case ClassConstants.CLASS_VERSION_1_0: return JavaConstants.CLASS_VERSION_1_0;
1212270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            case ClassConstants.CLASS_VERSION_1_2: return JavaConstants.CLASS_VERSION_1_2;
1222270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            case ClassConstants.CLASS_VERSION_1_3: return JavaConstants.CLASS_VERSION_1_3;
1232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            case ClassConstants.CLASS_VERSION_1_4: return JavaConstants.CLASS_VERSION_1_4;
1242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            case ClassConstants.CLASS_VERSION_1_5: return JavaConstants.CLASS_VERSION_1_5;
1252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            case ClassConstants.CLASS_VERSION_1_6: return JavaConstants.CLASS_VERSION_1_6;
1262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            case ClassConstants.CLASS_VERSION_1_7: return JavaConstants.CLASS_VERSION_1_7;
1272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            case ClassConstants.CLASS_VERSION_1_8: return JavaConstants.CLASS_VERSION_1_8;
1282270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            default:                               return null;
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Checks whether the given class version number is supported.
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param classVersion the combined class version number.
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @throws UnsupportedOperationException when the version is not supported.
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static void checkVersionNumbers(int classVersion) throws UnsupportedOperationException
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
1402270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if (classVersion < ClassConstants.CLASS_VERSION_1_0 ||
1412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            classVersion > ClassConstants.CLASS_VERSION_1_8)
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
143b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            throw new UnsupportedOperationException("Unsupported class version number ["+
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                    internalMajorClassVersion(classVersion)+"."+
145b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                                                    internalMinorClassVersion(classVersion)+"] (maximum "+
1462270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                                    ClassConstants.CLASS_VERSION_1_8_MAJOR+"."+
1472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                                    ClassConstants.CLASS_VERSION_1_8_MINOR+", Java "+
1482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                                    JavaConstants.CLASS_VERSION_1_8+")");
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts an external class name into an internal class name.
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param externalClassName the external class name,
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java.lang.Object</code>"
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the internal class name,
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java/lang/Object</code>".
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String internalClassName(String externalClassName)
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
1622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        return externalClassName.replace(JavaConstants.PACKAGE_SEPARATOR,
1632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                         ClassConstants.PACKAGE_SEPARATOR);
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts an internal class description into an external class description.
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param accessFlags       the access flags of the class.
170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalClassName the internal class name,
171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java/lang/Object</code>".
172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external class description,
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>public java.lang.Object</code>".
174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalFullClassDescription(int    accessFlags,
176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                      String internalClassName)
177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return externalClassAccessFlags(accessFlags) +
179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato               externalClassName(internalClassName);
180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts an internal class name into an external class name.
185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalClassName the internal class name,
186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java/lang/Object</code>".
187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external class name,
188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java.lang.Object</code>".
189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalClassName(String internalClassName)
191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
1922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        return //internalClassName.startsWith(ClassConstants.PACKAGE_JAVA_LANG) &&
1932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               //internalClassName.indexOf(ClassConstants.PACKAGE_SEPARATOR, ClassConstants.PACKAGE_JAVA_LANG.length() + 1) < 0 ?
1942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               //internalClassName.substring(ClassConstants.PACKAGE_JAVA_LANG.length()) :
1952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               internalClassName.replace(ClassConstants.PACKAGE_SEPARATOR,
1962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                         JavaConstants.PACKAGE_SEPARATOR);
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
201b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * Returns the external base type of an external array type, dropping any
202b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * array brackets.
203b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * @param externalArrayType the external array type,
204b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     *                          e.g. "<code>java.lang.Object[][]</code>"
205b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * @return the external base type,
206b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     *                          e.g. "<code>java.lang.Object</code>".
207b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     */
208b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public static String externalBaseType(String externalArrayType)
209b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
2102270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        int index = externalArrayType.indexOf(JavaConstants.TYPE_ARRAY);
211b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        return index >= 0 ?
212b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            externalArrayType.substring(0, index) :
213b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            externalArrayType;
214b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
215b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
216b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
217b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    /**
218b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * Returns the external short class name of an external class name, dropping
219b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * the package specification.
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param externalClassName the external class name,
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java.lang.Object</code>"
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external short class name,
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>Object</code>".
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalShortClassName(String externalClassName)
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
2272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        int index = externalClassName.lastIndexOf(JavaConstants.PACKAGE_SEPARATOR);
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return externalClassName.substring(index+1);
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether the given internal type is an array type.
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalType the internal type,
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                     e.g. "<code>[[Ljava/lang/Object;</code>".
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return <code>true</code> if the given type is an array type,
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         <code>false</code> otherwise.
238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static boolean isInternalArrayType(String internalType)
240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return internalType.length() > 1 &&
2422270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               internalType.charAt(0) == ClassConstants.TYPE_ARRAY;
243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the number of dimensions of the given internal type.
248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalType the internal type,
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                     e.g. "<code>[[Ljava/lang/Object;</code>".
250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the number of dimensions, e.g. 2.
251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static int internalArrayTypeDimensionCount(String internalType)
253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int dimensions = 0;
2552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        while (internalType.charAt(dimensions) == ClassConstants.TYPE_ARRAY)
256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dimensions++;
258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return dimensions;
261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether the given internal class name is one of the interfaces
266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * that is implemented by all array types. These class names are
267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * "<code>java/lang/Object</code>", "<code>java/lang/Cloneable</code>", and
268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * "<code>java/io/Serializable</code>"
269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalClassName the internal class name,
270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java/lang/Object</code>".
271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return <code>true</code> if the given type is an array interface name,
272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         <code>false</code> otherwise.
273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static boolean isInternalArrayInterfaceName(String internalClassName)
275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
2762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        return ClassConstants.NAME_JAVA_LANG_OBJECT.equals(internalClassName)    ||
2772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               ClassConstants.NAME_JAVA_LANG_CLONEABLE.equals(internalClassName) ||
2782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               ClassConstants.NAME_JAVA_IO_SERIALIZABLE.equals(internalClassName);
279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether the given internal type is a plain primitive type
284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * (not void).
285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalType the internal type,
286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                     e.g. "<code>I</code>".
287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return <code>true</code> if the given type is a class type,
288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         <code>false</code> otherwise.
289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static boolean isInternalPrimitiveType(char internalType)
291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
2922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        return internalType == ClassConstants.TYPE_BOOLEAN ||
2932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               internalType == ClassConstants.TYPE_BYTE    ||
2942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               internalType == ClassConstants.TYPE_CHAR    ||
2952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               internalType == ClassConstants.TYPE_SHORT   ||
2962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               internalType == ClassConstants.TYPE_INT     ||
2972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               internalType == ClassConstants.TYPE_FLOAT   ||
2982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               internalType == ClassConstants.TYPE_LONG    ||
2992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               internalType == ClassConstants.TYPE_DOUBLE;
300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether the given internal type is a primitive Category 2 type.
305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalType the internal type,
306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                     e.g. "<code>L</code>".
307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return <code>true</code> if the given type is a Category 2 type,
308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         <code>false</code> otherwise.
309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static boolean isInternalCategory2Type(String internalType)
311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return internalType.length() == 1 &&
3132270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               (internalType.charAt(0) == ClassConstants.TYPE_LONG ||
3142270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                internalType.charAt(0) == ClassConstants.TYPE_DOUBLE);
315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether the given internal type is a plain class type
320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * (including an array type of a plain class type).
321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalType the internal type,
322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                     e.g. "<code>Ljava/lang/Object;</code>".
323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return <code>true</code> if the given type is a class type,
324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         <code>false</code> otherwise.
325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static boolean isInternalClassType(String internalType)
327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int length = internalType.length();
329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return length > 1 &&
3302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom//             internalType.charAt(0)        == ClassConstants.TYPE_CLASS_START &&
3312270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               internalType.charAt(length-1) == ClassConstants.TYPE_CLASS_END;
332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the internal type of a given class name.
337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalClassName the internal class name,
338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java/lang/Object</code>".
339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the internal type,
340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>Ljava/lang/Object;</code>".
341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String internalTypeFromClassName(String internalClassName)
343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return internalArrayTypeFromClassName(internalClassName, 0);
345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the internal array type of a given class name with a given number
350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * of dimensions. If the number of dimensions is 0, the class name itself is
351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * returned.
352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalClassName the internal class name,
353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java/lang/Object</code>".
354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param dimensionCount    the number of array dimensions.
355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the internal array type of the array elements,
356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>Ljava/lang/Object;</code>".
357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String internalArrayTypeFromClassName(String internalClassName,
359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                        int    dimensionCount)
360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        StringBuffer buffer = new StringBuffer(internalClassName.length() + dimensionCount + 2);
362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int dimension = 0; dimension < dimensionCount; dimension++)
364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
3652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            buffer.append(ClassConstants.TYPE_ARRAY);
366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
3682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        return buffer.append(ClassConstants.TYPE_CLASS_START)
369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                     .append(internalClassName)
3702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                     .append(ClassConstants.TYPE_CLASS_END)
371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                     .toString();
372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the internal element type of a given internal array type.
377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalArrayType the internal array type,
378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>[[Ljava/lang/Object;</code>" or
379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                               "<code>[I</code>".
380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the internal type of the array elements,
381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>Ljava/lang/Object;</code>" or
382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                               "<code>I</code>".
383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String internalTypeFromArrayType(String internalArrayType)
385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
3862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        int index = internalArrayType.lastIndexOf(ClassConstants.TYPE_ARRAY);
387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return internalArrayType.substring(index+1);
388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the internal class name of a given internal class type
393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * (including an array type). Types involving primitive types are returned
394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * unchanged.
395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalClassType the internal class type,
396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>[Ljava/lang/Object;</code>",
397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                               "<code>Ljava/lang/Object;</code>", or
398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                               "<code>java/lang/Object</code>".
399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the internal class name,
400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java/lang/Object</code>".
401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String internalClassNameFromClassType(String internalClassType)
403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return isInternalClassType(internalClassType) ?
4052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            internalClassType.substring(internalClassType.indexOf(ClassConstants.TYPE_CLASS_START)+1,
406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                        internalClassType.length()-1) :
407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            internalClassType;
408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the internal class name of any given internal descriptor type,
413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * disregarding array prefixes.
414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalClassType the internal class type,
415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>Ljava/lang/Object;</code>" or
416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                               "<code>[[I</code>".
417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the internal class name,
418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java/lang/Object</code>" or
419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                               <code>null</code>.
420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String internalClassNameFromType(String internalClassType)
422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (!isInternalClassType(internalClassType))
424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return null;
426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Is it an array type?
429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (isInternalArrayType(internalClassType))
430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            internalClassType = internalTypeFromArrayType(internalClassType);
432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return internalClassNameFromClassType(internalClassType);
435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
439b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * Returns whether the given method name refers to a class initializer or
440b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * an instance initializer.
441b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * @param internalMethodName the internal method name,
442b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     *                           e.g. "<code>&ltclinit&gt;</code>".
443b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * @return whether the method name refers to an initializer,
444b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     *                           e.g. <code>true</code>.
445b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     */
446b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public static boolean isInitializer(String internalMethodName)
447b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
4482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        return internalMethodName.equals(ClassConstants.METHOD_NAME_CLINIT) ||
4492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               internalMethodName.equals(ClassConstants.METHOD_NAME_INIT);
450b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
451b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
452b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
453b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    /**
454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the internal type of the given internal method descriptor.
455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalMethodDescriptor the internal method descriptor,
456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>(II)Z</code>".
457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the internal return type,
458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>Z</code>".
459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String internalMethodReturnType(String internalMethodDescriptor)
461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
4622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        int index = internalMethodDescriptor.indexOf(ClassConstants.METHOD_ARGUMENTS_CLOSE);
463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return internalMethodDescriptor.substring(index + 1);
464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
465b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
466b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
467b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
468b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the number of parameters of the given internal method descriptor.
469b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalMethodDescriptor the internal method descriptor,
470b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>(ID)Z</code>".
471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the number of parameters,
472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. 2.
473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static int internalMethodParameterCount(String internalMethodDescriptor)
475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int counter = 0;
4772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        int index   = 1;
478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
4792270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        while (true)
4802270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        {
4812270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            char c = internalMethodDescriptor.charAt(index++);
4822270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            switch (c)
4832270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
4842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                case ClassConstants.TYPE_ARRAY:
4852270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                {
4862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    // Just ignore all array characters.
4872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    break;
4882270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                }
4892270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                case ClassConstants.TYPE_CLASS_START:
4902270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                {
4912270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    counter++;
4922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
4932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    // Skip the class name.
4942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    index = internalMethodDescriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1;
4952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    break;
4962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                }
4972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                default:
4982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                {
4992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    counter++;
5002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    break;
5012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                }
5022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                case ClassConstants.METHOD_ARGUMENTS_CLOSE:
5032270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                {
5042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    return counter;
5052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                }
5062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
507b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
508b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
509b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
510b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
511b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
512b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the size taken up on the stack by the parameters of the given
513b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * internal method descriptor. This accounts for long and double parameters
514b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * taking up two entries.
515b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalMethodDescriptor the internal method descriptor,
516b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>(ID)Z</code>".
517b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the size taken up on the stack,
518b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. 3.
519b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
520b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static int internalMethodParameterSize(String internalMethodDescriptor)
521b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
522b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return internalMethodParameterSize(internalMethodDescriptor, true);
523b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
524b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
525b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
526b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
527b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the size taken up on the stack by the parameters of the given
528b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * internal method descriptor. This accounts for long and double parameters
529b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * taking up two entries, and a non-static method taking up an additional
530b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * entry.
531b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalMethodDescriptor the internal method descriptor,
532b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>(ID)Z</code>".
533b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param accessFlags              the access flags of the method,
534b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. 0.
535b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the size taken up on the stack,
536b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. 4.
537b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
538b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static int internalMethodParameterSize(String internalMethodDescriptor,
539b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                  int    accessFlags)
540b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
541b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return internalMethodParameterSize(internalMethodDescriptor,
5422270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                           (accessFlags & ClassConstants.ACC_STATIC) != 0);
543b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
544b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
545b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
546b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
547b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the size taken up on the stack by the parameters of the given
548b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * internal method descriptor. This accounts for long and double parameters
549b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * taking up two spaces, and a non-static method taking up an additional
550b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * entry.
551b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalMethodDescriptor the internal method descriptor,
552b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>(ID)Z</code>".
553b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param isStatic                 specifies whether the method is static,
554b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. false.
555b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the size taken up on the stack,
556b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. 4.
557b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
558b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static int internalMethodParameterSize(String  internalMethodDescriptor,
559b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                  boolean isStatic)
560b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
5612270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        int size  = isStatic ? 0 : 1;
5622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        int index = 1;
563b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
5642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        while (true)
565b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
5662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            char c = internalMethodDescriptor.charAt(index++);
5672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            switch (c)
5682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
5692270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                case ClassConstants.TYPE_LONG:
5702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                case ClassConstants.TYPE_DOUBLE:
5712270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                {
5722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    size += 2;
5732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    break;
5742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                }
5752270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                case ClassConstants.TYPE_CLASS_START:
5762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                {
5772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    size++;
5782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
5792270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    // Skip the class name.
5802270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    index = internalMethodDescriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1;
5812270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    break;
5822270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                }
5832270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                case ClassConstants.TYPE_ARRAY:
5842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                {
5852270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    size++;
5862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
5872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    // Skip all array characters.
5882270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    while ((c = internalMethodDescriptor.charAt(index++)) == ClassConstants.TYPE_ARRAY) {}
5892270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
5902270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    if (c == ClassConstants.TYPE_CLASS_START)
5912270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    {
5922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                        // Skip the class type.
5932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                        index = internalMethodDescriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1;
5942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    }
5952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    break;
5962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                }
5972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                default:
5982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                {
5992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    size++;
6002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    break;
6012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                }
6022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                case ClassConstants.METHOD_ARGUMENTS_CLOSE:
6032270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                {
6042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    return size;
6052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                }
6062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
607b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
608b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
609b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
610b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
611b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
612b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the size taken up on the stack by the given internal type.
613b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * The size is 1, except for long and double types, for which it is 2,
614b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * and for the void type, for which 0 is returned.
615b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalType the internal type,
616b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                     e.g. "<code>I</code>".
617b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the size taken up on the stack,
618b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                     e.g. 1.
619b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
620b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static int internalTypeSize(String internalType)
621b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
622b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (internalType.length() == 1)
623b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
624b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            char internalPrimitiveType = internalType.charAt(0);
6252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            if      (internalPrimitiveType == ClassConstants.TYPE_LONG ||
6262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                     internalPrimitiveType == ClassConstants.TYPE_DOUBLE)
627b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
628b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                return 2;
629b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
6302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            else if (internalPrimitiveType == ClassConstants.TYPE_VOID)
631b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
632b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                return 0;
633b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
634b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
635b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
636b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return 1;
637b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
638b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
639b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
640b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
641b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts an external type into an internal type.
642b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param externalType the external type,
643b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                     e.g. "<code>java.lang.Object[][]</code>" or
644b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          "<code>int[]</code>".
645b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the internal type,
646b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                     e.g. "<code>[[Ljava/lang/Object;</code>" or
647b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          "<code>[I</code>".
648b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
649b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String internalType(String externalType)
650b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
651b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Strip the array part, if any.
652b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int dimensionCount = externalArrayTypeDimensionCount(externalType);
653b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (dimensionCount > 0)
654b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
6552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            externalType = externalType.substring(0, externalType.length() - dimensionCount * JavaConstants.TYPE_ARRAY.length());
656b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
657b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
658b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Analyze the actual type part.
659b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        char internalTypeChar =
6602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            externalType.equals(JavaConstants.TYPE_VOID   ) ? ClassConstants.TYPE_VOID    :
6612270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            externalType.equals(JavaConstants.TYPE_BOOLEAN) ? ClassConstants.TYPE_BOOLEAN :
6622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            externalType.equals(JavaConstants.TYPE_BYTE   ) ? ClassConstants.TYPE_BYTE    :
6632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            externalType.equals(JavaConstants.TYPE_CHAR   ) ? ClassConstants.TYPE_CHAR    :
6642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            externalType.equals(JavaConstants.TYPE_SHORT  ) ? ClassConstants.TYPE_SHORT   :
6652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            externalType.equals(JavaConstants.TYPE_INT    ) ? ClassConstants.TYPE_INT     :
6662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            externalType.equals(JavaConstants.TYPE_FLOAT  ) ? ClassConstants.TYPE_FLOAT   :
6672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            externalType.equals(JavaConstants.TYPE_LONG   ) ? ClassConstants.TYPE_LONG    :
6682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            externalType.equals(JavaConstants.TYPE_DOUBLE ) ? ClassConstants.TYPE_DOUBLE  :
6692270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            externalType.equals("%"                       ) ? '%'                         :
6702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                                              (char)0;
671b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
672b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        String internalType =
673b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            internalTypeChar != 0 ? String.valueOf(internalTypeChar) :
6742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                    ClassConstants.TYPE_CLASS_START +
675b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                    internalClassName(externalType) +
6762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                    ClassConstants.TYPE_CLASS_END;
677b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
678b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Prepend the array part, if any.
679b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int count = 0; count < dimensionCount; count++)
680b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
6812270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            internalType = ClassConstants.TYPE_ARRAY + internalType;
682b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
683b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
684b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return internalType;
685b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
686b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
687b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
688b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
689b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the number of dimensions of the given external type.
690b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param externalType the external type,
691b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                     e.g. "<code>[[Ljava/lang/Object;</code>".
692b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the number of dimensions, e.g. 2.
693b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
694b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static int externalArrayTypeDimensionCount(String externalType)
695b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
696b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int dimensions = 0;
6972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        int length = JavaConstants.TYPE_ARRAY.length();
698b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int offset = externalType.length() - length;
699b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        while (externalType.regionMatches(offset,
7002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                          JavaConstants.TYPE_ARRAY,
701b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                          0,
702b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                          length))
703b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
704b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dimensions++;
705b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            offset -= length;
706b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
707b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
708b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return dimensions;
709b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
710b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
711b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
712b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
713b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts an internal type into an external type.
714b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalType the internal type,
715b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                     e.g. "<code>[[Ljava/lang/Object;</code>" or
716b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          "<code>[I</code>".
717b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external type,
718b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                     e.g. "<code>java.lang.Object[][]</code>" or
719b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          "<code>int[]</code>".
720b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
721b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalType(String internalType)
722b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
723b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Strip the array part, if any.
724b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int dimensionCount = internalArrayTypeDimensionCount(internalType);
725b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (dimensionCount > 0)
726b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
727b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            internalType = internalType.substring(dimensionCount);
728b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
729b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
730b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Analyze the actual type part.
731b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        char internalTypeChar = internalType.charAt(0);
732b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
733b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        String externalType =
7342270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            internalTypeChar == ClassConstants.TYPE_VOID        ? JavaConstants.TYPE_VOID    :
7352270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            internalTypeChar == ClassConstants.TYPE_BOOLEAN     ? JavaConstants.TYPE_BOOLEAN :
7362270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            internalTypeChar == ClassConstants.TYPE_BYTE        ? JavaConstants.TYPE_BYTE    :
7372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            internalTypeChar == ClassConstants.TYPE_CHAR        ? JavaConstants.TYPE_CHAR    :
7382270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            internalTypeChar == ClassConstants.TYPE_SHORT       ? JavaConstants.TYPE_SHORT   :
7392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            internalTypeChar == ClassConstants.TYPE_INT         ? JavaConstants.TYPE_INT     :
7402270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            internalTypeChar == ClassConstants.TYPE_FLOAT       ? JavaConstants.TYPE_FLOAT   :
7412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            internalTypeChar == ClassConstants.TYPE_LONG        ? JavaConstants.TYPE_LONG    :
7422270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            internalTypeChar == ClassConstants.TYPE_DOUBLE      ? JavaConstants.TYPE_DOUBLE  :
7432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            internalTypeChar == '%'                             ? "%"                        :
7442270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            internalTypeChar == ClassConstants.TYPE_CLASS_START ? externalClassName(internalType.substring(1, internalType.indexOf(ClassConstants.TYPE_CLASS_END))) :
7452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                                                  null;
746b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
747b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (externalType == null)
748b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
749b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            throw new IllegalArgumentException("Unknown type ["+internalType+"]");
750b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
751b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
752b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Append the array part, if any.
753b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int count = 0; count < dimensionCount; count++)
754b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
7552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            externalType += JavaConstants.TYPE_ARRAY;
756b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
757b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
758b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return externalType;
759b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
760b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
761b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
762b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
763b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether the given internal descriptor String represents a method
764b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * descriptor.
765b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalDescriptor the internal descriptor String,
766b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                           e.g. "<code>(II)Z</code>".
767b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return <code>true</code> if the given String is a method descriptor,
768b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         <code>false</code> otherwise.
769b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
770b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static boolean isInternalMethodDescriptor(String internalDescriptor)
771b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
7722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        return internalDescriptor.charAt(0) == ClassConstants.METHOD_ARGUMENTS_OPEN;
773b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
774b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
775b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
776b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
777b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether the given member String represents an external method
778b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * name with arguments.
779b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param externalMemberNameAndArguments the external member String,
780b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                       e.g. "<code>myField</code>" or
781b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                       e.g. "<code>myMethod(int,int)</code>".
782b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return <code>true</code> if the given String refers to a method,
783b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         <code>false</code> otherwise.
784b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
785b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static boolean isExternalMethodNameAndArguments(String externalMemberNameAndArguments)
786b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
7872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        return externalMemberNameAndArguments.indexOf(JavaConstants.METHOD_ARGUMENTS_OPEN) > 0;
788b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
789b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
790b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
791b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
792b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the name part of the given external method name and arguments.
793b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param externalMethodNameAndArguments the external method name and arguments,
794b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                       e.g. "<code>myMethod(int,int)</code>".
795b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the name part of the String, e.g. "<code>myMethod</code>".
796b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
797b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalMethodName(String externalMethodNameAndArguments)
798b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
799b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        ExternalTypeEnumeration externalTypeEnumeration =
800b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new ExternalTypeEnumeration(externalMethodNameAndArguments);
801b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
802b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return externalTypeEnumeration.methodName();
803b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
804b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
805b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
806b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
807b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts the given external method return type and name and arguments to
808b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * an internal method descriptor.
809b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param externalReturnType             the external method return type,
810b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                       e.g. "<code>boolean</code>".
811b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param externalMethodNameAndArguments the external method name and arguments,
812b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                       e.g. "<code>myMethod(int,int)</code>".
813b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the internal method descriptor,
814b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                       e.g. "<code>(II)Z</code>".
815b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
816b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String internalMethodDescriptor(String externalReturnType,
817b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                  String externalMethodNameAndArguments)
818b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
819b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        StringBuffer internalMethodDescriptor = new StringBuffer();
8202270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_OPEN);
821b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
822b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        ExternalTypeEnumeration externalTypeEnumeration =
823b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new ExternalTypeEnumeration(externalMethodNameAndArguments);
824b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
825b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        while (externalTypeEnumeration.hasMoreTypes())
826b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
827b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            internalMethodDescriptor.append(internalType(externalTypeEnumeration.nextType()));
828b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
829b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
8302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_CLOSE);
831b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        internalMethodDescriptor.append(internalType(externalReturnType));
832b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
833b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return internalMethodDescriptor.toString();
834b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
835b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
836b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
837b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
838b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts the given external method return type and List of arguments to
839b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * an internal method descriptor.
840b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param externalReturnType the external method return type,
841b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                       e.g. "<code>boolean</code>".
842b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param externalArguments the external method arguments,
843b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                       e.g. <code>{ "int", "int" }</code>.
844b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the internal method descriptor,
845b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                       e.g. "<code>(II)Z</code>".
846b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
847b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String internalMethodDescriptor(String externalReturnType,
848b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                  List   externalArguments)
849b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
850b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        StringBuffer internalMethodDescriptor = new StringBuffer();
8512270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_OPEN);
852b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
853b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < externalArguments.size(); index++)
854b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
855b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            internalMethodDescriptor.append(internalType((String)externalArguments.get(index)));
856b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
857b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
8582270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_CLOSE);
859b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        internalMethodDescriptor.append(internalType(externalReturnType));
860b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
861b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return internalMethodDescriptor.toString();
862b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
863b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
864b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
865b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
866b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts an internal field description into an external full field description.
867b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param accessFlags             the access flags of the field.
868b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param fieldName               the field name,
869b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                e.g. "<code>myField</code>".
870b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalFieldDescriptor the internal field descriptor,
871b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                e.g. "<code>Z</code>".
872b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external full field description,
873b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                e.g. "<code>public boolean myField</code>".
874b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
875b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalFullFieldDescription(int    accessFlags,
876b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                      String fieldName,
877b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                      String internalFieldDescriptor)
878b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
879b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return externalFieldAccessFlags(accessFlags) +
880b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato               externalType(internalFieldDescriptor) +
881b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato               ' ' +
882b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato               fieldName;
883b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
884b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
885b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
886b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
887b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts an internal method description into an external full method description.
888b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalClassName        the internal name of the class of the method,
889b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>mypackage/MyClass</code>".
890b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param accessFlags              the access flags of the method.
891b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalMethodName       the internal method name,
892b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>myMethod</code>" or
893b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                      "<code>&lt;init&gt;</code>".
894b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalMethodDescriptor the internal method descriptor,
895b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>(II)Z</code>".
896b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external full method description,
897b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>public boolean myMethod(int,int)</code>" or
898b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                      "<code>public MyClass(int,int)</code>".
899b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
900b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalFullMethodDescription(String internalClassName,
901b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                       int    accessFlags,
902b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                       String internalMethodName,
903b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                       String internalMethodDescriptor)
904b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
905b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return externalMethodAccessFlags(accessFlags) +
906b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato               externalMethodReturnTypeAndName(internalClassName,
907b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               internalMethodName,
908b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               internalMethodDescriptor) +
9092270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               JavaConstants.METHOD_ARGUMENTS_OPEN +
910b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato               externalMethodArguments(internalMethodDescriptor) +
9112270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom               JavaConstants.METHOD_ARGUMENTS_CLOSE;
912b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
913b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
914b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
915b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
916b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts internal class access flags into an external access description.
917b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param accessFlags the class access flags.
918b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external class access description,
919b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         e.g. "<code>public final </code>".
920b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
921b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalClassAccessFlags(int accessFlags)
922b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
923b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return externalClassAccessFlags(accessFlags, "");
924b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
925b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
926b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
927b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
928b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts internal class access flags into an external access description.
929b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param accessFlags the class access flags.
930b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param prefix      a prefix that is added to each access modifier.
931b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external class access description,
932b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         e.g. "<code>public final </code>".
933b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
934b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalClassAccessFlags(int accessFlags, String prefix)
935b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
936b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (accessFlags == 0)
937b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
938b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return EMPTY_STRING;
939b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
940b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
941b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        StringBuffer string = new StringBuffer(50);
942b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
9432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_PUBLIC) != 0)
944b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
9452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_PUBLIC).append(' ');
946b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
9472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_PRIVATE) != 0)
948b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
949b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            // Only in InnerClasses attributes.
9502270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_PRIVATE).append(' ');
951b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
9522270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_PROTECTED) != 0)
953b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
954b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            // Only in InnerClasses attributes.
9552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_PROTECTED).append(' ');
956b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
9572270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_STATIC) != 0)
958b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
959b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            // Only in InnerClasses attributes.
9602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_STATIC).append(' ');
961b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
9622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_FINAL) != 0)
963b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
9642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_FINAL).append(' ');
965b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
9662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_ANNOTATTION) != 0)
967b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
9682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_ANNOTATION);
969b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
9702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_INTERFACE) != 0)
971b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
9722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_INTERFACE).append(' ');
973b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
9742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        else if ((accessFlags & ClassConstants.ACC_ENUM) != 0)
975b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
9762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_ENUM).append(' ');
977b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
9782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        else if ((accessFlags & ClassConstants.ACC_ABSTRACT) != 0)
979b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
9802270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_ABSTRACT).append(' ');
981b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
9822270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        else if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0)
983b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
9842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' ');
985b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
986b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
987b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return string.toString();
988b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
989b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
990b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
991b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
992b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts internal field access flags into an external access description.
993b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param accessFlags the field access flags.
994b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external field access description,
995b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         e.g. "<code>public volatile </code>".
996b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
997b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalFieldAccessFlags(int accessFlags)
998b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
999b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return externalFieldAccessFlags(accessFlags, "");
1000b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
1001b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1002b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1003b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
1004b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts internal field access flags into an external access description.
1005b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param accessFlags the field access flags.
1006b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param prefix      a prefix that is added to each access modifier.
1007b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external field access description,
1008b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         e.g. "<code>public volatile </code>".
1009b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
1010b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalFieldAccessFlags(int accessFlags, String prefix)
1011b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
1012b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (accessFlags == 0)
1013b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
1014b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return EMPTY_STRING;
1015b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
1016b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1017b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        StringBuffer string = new StringBuffer(50);
1018b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
10192270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_PUBLIC) != 0)
1020b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
10212270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_PUBLIC).append(' ');
1022b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
10232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_PRIVATE) != 0)
1024b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
10252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_PRIVATE).append(' ');
1026b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
10272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_PROTECTED) != 0)
1028b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
10292270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_PROTECTED).append(' ');
1030b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
10312270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_STATIC) != 0)
1032b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
10332270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_STATIC).append(' ');
1034b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
10352270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_FINAL) != 0)
1036b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
10372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_FINAL).append(' ');
1038b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
10392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_VOLATILE) != 0)
1040b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
10412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_VOLATILE).append(' ');
1042b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
10432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_TRANSIENT) != 0)
1044b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
10452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_TRANSIENT).append(' ');
1046b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
10472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0)
1048b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
10492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' ');
1050b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
1051b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1052b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return string.toString();
1053b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
1054b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1055b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1056b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
1057b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts internal method access flags into an external access description.
1058b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param accessFlags the method access flags.
1059b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external method access description,
1060b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                    e.g. "<code>public synchronized </code>".
1061b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
1062b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalMethodAccessFlags(int accessFlags)
1063b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
1064b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return externalMethodAccessFlags(accessFlags, "");
1065b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
1066b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1067b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1068b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
1069b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts internal method access flags into an external access description.
1070b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param accessFlags the method access flags.
1071b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param prefix      a prefix that is added to each access modifier.
1072b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external method access description,
1073b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                    e.g. "public synchronized ".
1074b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
1075b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalMethodAccessFlags(int accessFlags, String prefix)
1076b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
1077b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (accessFlags == 0)
1078b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
1079b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return EMPTY_STRING;
1080b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
1081b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1082b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        StringBuffer string = new StringBuffer(50);
1083b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
10842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_PUBLIC) != 0)
10852270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        {
10862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_PUBLIC).append(' ');
10872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        }
10882270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_PRIVATE) != 0)
10892270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        {
10902270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_PRIVATE).append(' ');
10912270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        }
10922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_PROTECTED) != 0)
10932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        {
10942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_PROTECTED).append(' ');
10952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        }
10962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_STATIC) != 0)
10972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        {
10982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_STATIC).append(' ');
10992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        }
11002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_FINAL) != 0)
1101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
11022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_FINAL).append(' ');
1103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
11042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_SYNCHRONIZED) != 0)
1105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
11062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_SYNCHRONIZED).append(' ');
1107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
11082270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_BRIDGE) != 0)
1109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
11102270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_BRIDGE).append(' ');
1111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
11122270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_VARARGS) != 0)
1113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
11142270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_VARARGS).append(' ');
1115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
11162270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_NATIVE) != 0)
1117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
11182270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_NATIVE).append(' ');
1119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
11202270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_ABSTRACT) != 0)
1121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
11222270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_ABSTRACT).append(' ');
1123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
11242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_STRICT) != 0)
1125b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
11262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_STRICT).append(' ');
1127b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
11282270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0)
1129b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
11302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' ');
1131b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
11322270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
11332270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        return string.toString();
11342270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    }
11352270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
11362270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
11372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    /**
11382270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     * Converts internal method parameter access flags into an external access
11392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     * description.
11402270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     * @param accessFlags the method parameter access flags.
11412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     * @return the external method parameter access description,
11422270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     *                    e.g. "<code>final mandated </code>".
11432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     */
11442270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    public static String externalParameterAccessFlags(int accessFlags)
11452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    {
11462270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        return externalParameterAccessFlags(accessFlags, "");
11472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    }
11482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
11492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
11502270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    /**
11512270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     * Converts internal method parameter access flags into an external access
11522270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     * description.
11532270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     * @param accessFlags the method parameter access flags.
11542270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     * @param prefix      a prefix that is added to each access modifier.
11552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     * @return the external method parameter access description,
11562270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     *                    e.g. "final mandated ".
11572270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     */
11582270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    public static String externalParameterAccessFlags(int accessFlags, String prefix)
11592270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    {
11602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if (accessFlags == 0)
1161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
11622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            return EMPTY_STRING;
1163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
11642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
11652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        StringBuffer string = new StringBuffer(50);
11662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
11672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_FINAL) != 0)
1168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
11692270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_FINAL).append(' ');
1170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
11712270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0)
1172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
11732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' ');
1174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
11752270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((accessFlags & ClassConstants.ACC_MANDATED) != 0)
1176b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
11772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            string.append(prefix).append(JavaConstants.ACC_MANDATED).append(' ');
1178b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
1179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return string.toString();
1181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
1182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
1185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts an internal method descriptor into an external method return type.
1186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalMethodDescriptor the internal method descriptor,
1187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>(II)Z</code>".
1188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external method return type,
1189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>boolean</code>".
1190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
1191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalMethodReturnType(String internalMethodDescriptor)
1192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
1193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return externalType(internalMethodReturnType(internalMethodDescriptor));
1194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
1195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
1198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts an internal class name, method name, and method descriptor to
1199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * an external method return type and name.
1200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalClassName        the internal name of the class of the method,
1201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>mypackage/MyClass</code>".
1202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalMethodName       the internal method name,
1203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>myMethod</code>" or
1204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                      "<code>&lt;init&gt;</code>".
1205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalMethodDescriptor the internal method descriptor,
1206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>(II)Z</code>".
1207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external method return type and name,
1208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>boolean myMethod</code>" or
1209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                      "<code>MyClass</code>".
1210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
1211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private static String externalMethodReturnTypeAndName(String internalClassName,
1212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                          String internalMethodName,
1213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                          String internalMethodDescriptor)
1214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
12152270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        return internalMethodName.equals(ClassConstants.METHOD_NAME_INIT) ?
1216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            externalShortClassName(externalClassName(internalClassName)) :
1217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            (externalMethodReturnType(internalMethodDescriptor) +
1218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ' ' +
1219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             internalMethodName);
1220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
1221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
1224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Converts an internal method descriptor into an external method argument
1225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * description.
1226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalMethodDescriptor the internal method descriptor,
1227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>(II)Z</code>".
1228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external method argument description,
1229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                                 e.g. "<code>int,int</code>".
1230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
1231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalMethodArguments(String internalMethodDescriptor)
1232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
1233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        StringBuffer externalMethodNameAndArguments = new StringBuffer();
1234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        InternalTypeEnumeration internalTypeEnumeration =
1236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new InternalTypeEnumeration(internalMethodDescriptor);
1237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        while (internalTypeEnumeration.hasMoreTypes())
1239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
1240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            externalMethodNameAndArguments.append(externalType(internalTypeEnumeration.nextType()));
1241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (internalTypeEnumeration.hasMoreTypes())
1242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
12432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                externalMethodNameAndArguments.append(JavaConstants.METHOD_ARGUMENTS_SEPARATOR);
1244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
1245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
1246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return externalMethodNameAndArguments.toString();
1248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
1249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
1252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the internal package name of the given internal class name.
1253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalClassName the internal class name,
1254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java/lang/Object</code>".
1255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the internal package name,
1256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java/lang</code>".
1257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
1258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String internalPackageName(String internalClassName)
1259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
1260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        String internalPackagePrefix = internalPackagePrefix(internalClassName);
1261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int length = internalPackagePrefix.length();
1262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return length > 0 ?
1263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            internalPackagePrefix.substring(0, length - 1) :
1264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            "";
1265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
1266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
1269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the internal package prefix of the given internal class name.
1270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param internalClassName the internal class name,
1271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java/lang/Object</code>".
1272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the internal package prefix,
1273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java/lang/</code>".
1274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
1275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String internalPackagePrefix(String internalClassName)
1276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
12772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        return internalClassName.substring(0, internalClassName.lastIndexOf(ClassConstants.PACKAGE_SEPARATOR,
1278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                            internalClassName.length() - 2) + 1);
1279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
1280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
1283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the external package name of the given external class name.
1284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param externalClassName the external class name,
1285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java.lang.Object</code>".
1286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external package name,
1287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java.lang</code>".
1288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
1289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalPackageName(String externalClassName)
1290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
1291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        String externalPackagePrefix = externalPackagePrefix(externalClassName);
1292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int length = externalPackagePrefix.length();
1293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return length > 0 ?
1294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            externalPackagePrefix.substring(0, length - 1) :
1295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            "";
1296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
1297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
1300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the external package prefix of the given external class name.
1301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param externalClassName the external class name,
1302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java.lang.Object</code>".
1303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return the external package prefix,
1304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                          e.g. "<code>java.lang.</code>".
1305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
1306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static String externalPackagePrefix(String externalClassName)
1307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
13082270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        return externalClassName.substring(0, externalClassName.lastIndexOf(JavaConstants.PACKAGE_SEPARATOR,
1309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                            externalClassName.length() - 2) + 1);
1310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
1311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
1312