/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.proxy.compiler;
import org.apache.bcel.Constants;
import org.apache.bcel.generic.BasicType;
import org.apache.bcel.generic.ObjectType;
import org.apache.bcel.generic.Type;
import org.jboss.util.UnreachableStatementException;
/**
* Some Routines to convert from <code>java.lang.Class</code> to
* <code>org.apache.bcel.generic.Type</code>. These get round some
* inconsistencies with Class.getName() wrt primitives.
*
* <pre>
* e.g.
*
* <code>Character.Type.getName()</code> returns char.
*
* </pre>
*
* <p>
* I think it should return C. Don't know if this is a code bug. But there's a bug
* on Bug Parade (#4369208) about the javadoc being misleading.
*
* @see java.lang.Class#getName
*
* @version <tt>$Revision: 81030 $</tt>
* @author <a href="mailto:neale@isismanor.co.uk">Neale Swinnerton</a>
* @author <a href="mailto:jason@planet57.com">Jason Dillon</a>
*/
public abstract class Utility
extends org.apache.bcel.classfile.Utility
{
/**
* Get the <code>org.apache.bcel.generic.Type</code> for a class.
* This handles the case where the class represents an n-dimensional
* array by relying on the fact that <code>Class.getName()</code>
* on an array returns the signature
*
* <pre>
* e.g.
*
* <code>new Object[].getClass().getName()</code> returns [Ljava.lang.Object;
*
* </pre>
*
* @see Utility
*
* @param clazz a <code>Class</code> value
* @return a <code>Type</code> value
*/
public static Type getType(Class clazz) {
if (clazz.isPrimitive()) {
if (clazz.equals(Boolean.TYPE) ) {
return Type.BOOLEAN;
}
else if (clazz.equals(Byte.TYPE) ) {
return Type.BYTE;
}
else if (clazz.equals(Character.TYPE) ) {
return Type.CHAR;
}
else if (clazz.equals(Double.TYPE) ) {
return Type.DOUBLE;
}
else if (clazz.equals(Float.TYPE) ) {
return Type.FLOAT;
}
else if (clazz.equals(Integer.TYPE) ) {
return Type.INT;
}
else if (clazz.equals(Long.TYPE) ) {
return Type.LONG;
}
else if (clazz.equals(Short.TYPE) ) {
return Type.SHORT;
}
else if (clazz.equals(Void.TYPE) ) {
return Type.VOID;
}
// should never get here
throw new UnreachableStatementException();
}
// if we get this far it is not a primitive
String name = clazz.getName();
if (clazz.isArray()) {
return Type.getType(name);
}
return new ObjectType(name);
}
/**
* Get the <code>org.apache.bcel.generic.Type</code> for an array of Classes
*
* @param classes a <code>Class[]</code> value
* @return a <code>Type[]</code> value
*/
public static Type[] getTypes(Class[] classes) {
Type[] types = new Type[classes.length];
for (int i = 0; i < classes.length; i++) {
types[i] = getType(classes[i]);
}
return types;
}
/**
* Get the Object equivalent Class name for a primitive
*
* <pre>
* e.g
*
* int <-> java.lang.Integer
* char <-> Character
*
* </pre>
*
* @param t a <code>BasicType</code> value
* @return a <code>String</code> value
*
* @throws IllegalArgumentException Unexpected type
*/
public static String getObjectEquivalentClassName(BasicType t) {
switch (t.getType()) {
case Constants.T_INT:
return "java.lang.Integer";
case Constants.T_SHORT:
return "java.lang.Short";
case Constants.T_BOOLEAN:
return "java.lang.Boolean";
case Constants.T_CHAR:
return "java.lang.Character";
case Constants.T_BYTE:
return "java.lang.Byte";
case Constants.T_FLOAT:
return "java.lang.Float";
case Constants.T_DOUBLE:
return "java.lang.Double";
case Constants.T_LONG:
return "java.lang.Long";
default:
throw new IllegalArgumentException("Unexpected Type: " + t);
}
}
}