Applying my patch from LANG-298, based on Tomasz Blachowicz's original patch, and adds getPackageCanonicalName and getShortCanonicalName sets of methods

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/lang/trunk@612749 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Henri Yandell 2008-01-17 08:05:23 +00:00
parent 57c6a6e832
commit 10658442a5
2 changed files with 234 additions and 10 deletions

View File

@ -35,6 +35,7 @@ import java.util.Map;
* @author Gary Gregory
* @author Norm Deane
* @author Alban Peignier
* @author Tomasz Blachowicz
* @since 2.0
* @version $Id$
*/
@ -94,15 +95,35 @@ public class ClassUtils {
* Maps a primitive class name to its corresponding abbreviation used in array class names.
*/
private static Map abbreviationMap = new HashMap();
/**
* Maps an abbreviation used in array class names to corresponding primitive class name.
*/
private static Map reverseAbbreviationMap = new HashMap();
/**
* Add primitive type abbreviation to maps of abbreviations.
*
* @param primitive Canonical name of primitive type
* @param abbreviation Corresponding abbreviation of primitive type
*/
private static void addAbbreviation(String primitive, String abbreviation) {
abbreviationMap.put(primitive, abbreviation);
reverseAbbreviationMap.put(abbreviation, primitive);
}
/**
* Feed abbreviation maps
*/
static {
abbreviationMap.put( "int", "I" );
abbreviationMap.put( "boolean", "Z" );
abbreviationMap.put( "float", "F" );
abbreviationMap.put( "long", "J" );
abbreviationMap.put( "short", "S" );
abbreviationMap.put( "byte", "B" );
abbreviationMap.put( "double", "D" );
abbreviationMap.put( "char", "C" );
addAbbreviation("int", "I");
addAbbreviation("boolean", "Z");
addAbbreviation("float", "F");
addAbbreviation("long", "J");
addAbbreviation("short", "S");
addAbbreviation("byte", "B");
addAbbreviation("double", "D");
addAbbreviation("char", "C");
}
/**
@ -605,7 +626,7 @@ public class ClassUtils {
String clsName = "[" + abbreviationMap.get(className);
clazz = Class.forName(clsName, initialize, classLoader).getComponentType();
} else {
clazz = Class.forName(toProperClassName(className), initialize, classLoader);
clazz = Class.forName(toCanonicalName(className), initialize, classLoader);
}
return clazz;
}
@ -718,7 +739,7 @@ public class ClassUtils {
* @param className the class name
* @return the converted name
*/
private static String toProperClassName(String className) {
private static String toCanonicalName(String className) {
className = StringUtils.deleteWhitespace(className);
if (className == null) {
throw new NullArgumentException("className");
@ -761,4 +782,143 @@ public class ClassUtils {
}
return classes;
}
// Short canonical name
// ----------------------------------------------------------------------
/**
* <p>Gets the canonical name minus the package name for an <code>Object</code>.</p>
*
* @param object the class to get the short name for, may be null
* @param valueIfNull the value to return if null
* @return the canonical name of the object without the package name, or the null value
* @since 2.4
*/
public static String getShortCanonicalName(Object object, String valueIfNull) {
if (object == null) {
return valueIfNull;
}
return getShortCanonicalName(object.getClass().getName());
}
/**
* <p>Gets the canonical name minus the package name from a <code>Class</code>.</p>
*
* @param cls the class to get the short name for.
* @return the canonical name without the package name or an empty string
* @since 2.4
*/
public static String getShortCanonicalName(Class cls) {
if (cls == null) {
return StringUtils.EMPTY;
}
return getShortCanonicalName(cls.getName());
}
/**
* <p>Gets the canonical name minus the package name from a String.</p>
*
* <p>The string passed in is assumed to be a canonical name - it is not checked.</p>
*
* @param className the className to get the short name for
* @return the canonical name of the class without the package name or an empty string
* @since 2.4
*/
public static String getShortCanonicalName(String canonicalName) {
return ClassUtils.getShortClassName(getCanonicalName(canonicalName));
}
// Package name
// ----------------------------------------------------------------------
/**
* <p>Gets the package name from the canonical name of an <code>Object</code>.</p>
*
* @param object the class to get the package name for, may be null
* @param valueIfNull the value to return if null
* @return the package name of the object, or the null value
* @since 2.4
*/
public static String getPackageCanonicalName(Object object, String valueIfNull) {
if (object == null) {
return valueIfNull;
}
return getPackageCanonicalName(object.getClass().getName());
}
/**
* <p>Gets the package name from the canonical name of a <code>Class</code>.</p>
*
* @param cls the class to get the package name for, may be <code>null</code>.
* @return the package name or an empty string
* @since 2.4
*/
public static String getPackageCanonicalName(Class cls) {
if (cls == null) {
return StringUtils.EMPTY;
}
return getPackageCanonicalName(cls.getName());
}
/**
* <p>Gets the package name from the canonical name. </p>
*
* <p>The string passed in is assumed to be a canonical name - it is not checked.</p>
* <p>If the class is unpackaged, return an empty string.</p>
*
* @param canonicalName the canonical name to get the package name for, may be <code>null</code>
* @return the package name or an empty string
* @since 2.4
*/
public static String getPackageCanonicalName(String canonicalName) {
return ClassUtils.getPackageName(getCanonicalName(canonicalName));
}
/**
* <p>Converts a given name of class into canonical format.
* If name of class is not a name of array class it returns
* unchanged name.</p>
* <p>Example:
* <ul>
* <li><code>getCanonicalName("[I") = "int[]"</code></li>
* <li><code>getCanonicalName("[Ljava.lang.String;") = "java.lang.String[]"</code></li>
* <li><code>getCanonicalName("java.lang.String") = "java.lang.String"</code></li>
* </ul>
* </p>
*
* @param className the name of class
* @return canonical form of class name
* @since 2.4
*/
private static String getCanonicalName(String className) {
className = StringUtils.deleteWhitespace(className);
if (className == null) {
return null;
} else {
int dim = 0;
while(className.startsWith("[")) {
dim++;
className = className.substring(1);
}
if(dim < 1) {
return className;
} else {
if(className.startsWith("L")) {
className = className.substring(
1,
className.endsWith(";")
? className.length() - 1
: className.length());
} else {
if(className.length() > 0) {
className = (String) reverseAbbreviationMap.get(
className.substring(0, 1));
}
}
StringBuffer canonicalClassNameBuffer = new StringBuffer(className);
for(int i = 0; i < dim; i++) {
canonicalClassNameBuffer.append("[]");
}
return canonicalClassNameBuffer.toString();
}
}
}
}

View File

@ -38,6 +38,7 @@ import junit.textui.TestRunner;
*
* @author Stephen Colebourne
* @author Gary D. Gregory
* @author Tomasz Blachowicz
* @version $Id$
*/
public class ClassUtilsTest extends TestCase {
@ -599,4 +600,67 @@ public class ClassUtilsTest extends TestCase {
assertEquals("Double", ClassUtils.getShortClassName(results[2]));
}
public void test_getShortCanonicalName_Object() {
assertEquals("<null>", ClassUtils.getShortCanonicalName(null, "<null>"));
assertEquals("ClassUtils", ClassUtils.getShortCanonicalName(new ClassUtils(), "<null>"));
assertEquals("ClassUtils[]", ClassUtils.getShortCanonicalName(new ClassUtils[0], "<null>"));
assertEquals("ClassUtils[][]", ClassUtils.getShortCanonicalName(new ClassUtils[0][0], "<null>"));
assertEquals("int[]", ClassUtils.getShortCanonicalName(new int[0], "<null>"));
assertEquals("int[][]", ClassUtils.getShortCanonicalName(new int[0][0], "<null>"));
}
public void test_getShortCanonicalName_Class() {
assertEquals("ClassUtils", ClassUtils.getShortCanonicalName(ClassUtils.class));
assertEquals("ClassUtils[]", ClassUtils.getShortCanonicalName(ClassUtils[].class));
assertEquals("ClassUtils[][]", ClassUtils.getShortCanonicalName(ClassUtils[][].class));
assertEquals("int[]", ClassUtils.getShortCanonicalName(int[].class));
assertEquals("int[][]", ClassUtils.getShortCanonicalName(int[][].class));
}
public void test_getShortCanonicalName_String() {
assertEquals("ClassUtils", ClassUtils.getShortCanonicalName("org.apache.commons.lang.ClassUtils"));
assertEquals("ClassUtils[]", ClassUtils.getShortCanonicalName("[Lorg.apache.commons.lang.ClassUtils;"));
assertEquals("ClassUtils[][]", ClassUtils.getShortCanonicalName("[[Lorg.apache.commons.lang.ClassUtils;"));
assertEquals("ClassUtils[]", ClassUtils.getShortCanonicalName("org.apache.commons.lang.ClassUtils[]"));
assertEquals("ClassUtils[][]", ClassUtils.getShortCanonicalName("org.apache.commons.lang.ClassUtils[][]"));
assertEquals("int[]", ClassUtils.getShortCanonicalName("[I"));
assertEquals("int[][]", ClassUtils.getShortCanonicalName("[[I"));
assertEquals("int[]", ClassUtils.getShortCanonicalName("int[]"));
assertEquals("int[][]", ClassUtils.getShortCanonicalName("int[][]"));
}
public void test_getPackageCanonicalName_Object() {
assertEquals("<null>", ClassUtils.getPackageCanonicalName(null, "<null>"));
assertEquals("org.apache.commons.lang", ClassUtils.getPackageCanonicalName(new ClassUtils(), "<null>"));
assertEquals("org.apache.commons.lang", ClassUtils.getPackageCanonicalName(new ClassUtils[0], "<null>"));
assertEquals("org.apache.commons.lang", ClassUtils.getPackageCanonicalName(new ClassUtils[0][0], "<null>"));
assertEquals("", ClassUtils.getPackageCanonicalName(new int[0], "<null>"));
assertEquals("", ClassUtils.getPackageCanonicalName(new int[0][0], "<null>"));
}
public void test_getPackageCanonicalName_Class() {
assertEquals("org.apache.commons.lang", ClassUtils.getPackageCanonicalName(ClassUtils.class));
assertEquals("org.apache.commons.lang", ClassUtils.getPackageCanonicalName(ClassUtils[].class));
assertEquals("org.apache.commons.lang", ClassUtils.getPackageCanonicalName(ClassUtils[][].class));
assertEquals("", ClassUtils.getPackageCanonicalName(int[].class));
assertEquals("", ClassUtils.getPackageCanonicalName(int[][].class));
}
public void test_getPackageCanonicalName_String() {
assertEquals("org.apache.commons.lang",
ClassUtils.getPackageCanonicalName("org.apache.commons.lang.ClassUtils"));
assertEquals("org.apache.commons.lang",
ClassUtils.getPackageCanonicalName("[Lorg.apache.commons.lang.ClassUtils;"));
assertEquals("org.apache.commons.lang",
ClassUtils.getPackageCanonicalName("[[Lorg.apache.commons.lang.ClassUtils;"));
assertEquals("org.apache.commons.lang",
ClassUtils.getPackageCanonicalName("org.apache.commons.lang.ClassUtils[]"));
assertEquals("org.apache.commons.lang",
ClassUtils.getPackageCanonicalName("org.apache.commons.lang.ClassUtils[][]"));
assertEquals("", ClassUtils.getPackageCanonicalName("[I"));
assertEquals("", ClassUtils.getPackageCanonicalName("[[I"));
assertEquals("", ClassUtils.getPackageCanonicalName("int[]"));
assertEquals("", ClassUtils.getPackageCanonicalName("int[][]"));
}
}