/*
* Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package org.glassfish.jersey.internal.util;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
Utility class to print the variety of types, useful in toString
method. Author: John Wells (john.wells at oracle.com)
/**
* Utility class to print the variety of types, useful in {@code toString} method.
*
* @author John Wells (john.wells at oracle.com)
*/
public class Pretty {
private static final String DOT = ".";
private static final String NULL_STRING = "null";
private static final String CONSTRUCTOR_NAME = "<init>";
Private constructor to forbid the creation of Pretty instance.
/**
* Private constructor to forbid the creation of Pretty instance.
*/
private Pretty() {
}
Makes a nice, pretty class (without the package name).
Params: - clazz – Make me a pretty class.
Returns: A nice string of the class, with no package.
/**
* Makes a nice, pretty class (without the package name).
*
* @param clazz Make me a pretty class.
* @return A nice string of the class, with no package.
*/
public static String clazz(Class<?> clazz) {
if (clazz == null) {
return NULL_STRING;
}
String cn = clazz.getName();
int index = cn.lastIndexOf(DOT);
if (index < 0) {
return cn;
}
// If this fails, the class name somehow ends in dot, which should be illegal
return cn.substring(index + 1);
}
Prints a pretty parameterized type.
Params: - pType – The parameterized type to print. May not be null.
Returns: A pretty string version of the parameterized type.
/**
* Prints a pretty parameterized type.
*
* @param pType The parameterized type to print. May not be null.
* @return A pretty string version of the parameterized type.
*/
public static String pType(ParameterizedType pType) {
StringBuffer sb = new StringBuffer();
sb.append(clazz(ReflectionHelper.getRawClass(pType)) + "<");
boolean first = true;
for (Type t : pType.getActualTypeArguments()) {
if (first) {
first = false;
sb.append(type(t));
} else {
sb.append("," + type(t));
}
}
sb.append(">");
return sb.toString();
}
Returns a pretty string for the given type.
Params: - t – A possibly null type.
Returns: A pretty string representing the type.
/**
* Returns a pretty string for the given type.
*
* @param t A possibly null type.
* @return A pretty string representing the type.
*/
public static String type(Type t) {
if (t == null) {
return NULL_STRING;
}
if (t instanceof Class) {
return clazz((Class<?>) t);
}
if (t instanceof ParameterizedType) {
return pType((ParameterizedType) t);
}
return t.toString();
}
Make a nice pretty string out of the constructor and all its parameters.
Params: - constructor – The constructor to make pretty.
Returns: A nice pretty string.
/**
* Make a nice pretty string out of the constructor and all its parameters.
*
* @param constructor The constructor to make pretty.
* @return A nice pretty string.
*/
public static String constructor(Constructor<?> constructor) {
if (constructor == null) {
return NULL_STRING;
}
return CONSTRUCTOR_NAME + prettyPrintParameters(constructor.getParameterTypes());
}
Makes a nice pretty string of the method, with the method name and all parameters.
Params: - method – The method to make pretty.
Returns: A nice pretty string.
/**
* Makes a nice pretty string of the method, with the method name and all parameters.
*
* @param method The method to make pretty.
* @return A nice pretty string.
*/
public static String method(Method method) {
if (method == null) {
return NULL_STRING;
}
return method.getName() + prettyPrintParameters(method.getParameterTypes());
}
Returns a pretty string representing a Field.
Params: - field – The possibly null field.
Returns: A pretty string representing the field.
/**
* Returns a pretty string representing a Field.
*
* @param field The possibly null field.
* @return A pretty string representing the field.
*/
public static String field(Field field) {
if (field == null) {
return NULL_STRING;
}
Type t = field.getGenericType();
String baseString;
if (t instanceof Class) {
baseString = clazz((Class<?>) t);
} else {
baseString = type(t);
}
return "field(" + baseString + " " + field.getName() + " in " + field.getDeclaringClass().getName() + ")";
}
Returns a pretty string for the given array.
Params: - array – The possibly null array to represent.
Returns: A pretty string representation of the array.
/**
* Returns a pretty string for the given array.
*
* @param array The possibly null array to represent.
* @return A pretty string representation of the array.
*/
public static String array(Object[] array) {
if (array == null) {
return NULL_STRING;
}
StringBuffer sb = new StringBuffer("{");
boolean first = true;
for (Object item : array) {
if (item != null && (item instanceof Class)) {
item = Pretty.clazz((Class<?>) item);
}
if (first) {
first = false;
sb.append((item == null) ? "null" : item.toString());
} else {
sb.append("," + ((item == null) ? "null" : item.toString()));
}
}
sb.append("}");
return sb.toString();
}
Returns a pretty string representing the collection.
Params: - collection – A possibly null collection to represent.
Returns: A pretty string representing the collection.
/**
* Returns a pretty string representing the collection.
*
* @param collection A possibly null collection to represent.
* @return A pretty string representing the collection.
*/
public static String collection(Collection<?> collection) {
if (collection == null) {
return NULL_STRING;
}
return array(collection.toArray(new Object[collection.size()]));
}
private static String prettyPrintParameters(Class<?> params[]) {
if (params == null) {
return NULL_STRING;
}
StringBuffer sb = new StringBuffer("(");
boolean first = true;
for (Class<?> param : params) {
if (first) {
sb.append(clazz(param));
first = false;
} else {
sb.append("," + clazz(param));
}
}
sb.append(")");
return sb.toString();
}
}