/******************************************************************************* * Copyright (c) 2006, 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Mike Kucera (IBM Corporation) - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.core.parser.util; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; /** * This class contains several convenience methods * mainly for debugging purposes. * * @noextend This interface is not intended to be extended by clients. * @noinstantiate This class is not intended to be instantiated by clients. */ @SuppressWarnings("nls") public class DebugUtil { private DebugUtil() { // class just contains static methods } /** * Prints a trace message to stdout that gives info * about the method that calls this method. */ public static void printMethodTrace() { StackTraceElement[] trace = Thread.currentThread().getStackTrace(); printMethodTrace(trace, null); } /** * Prints a trace message to stdout that gives info * about the method that calls this method. * * The output is in a format that will show up as a hyperlink in the eclipse console. */ public static void printMethodTrace(String extraMessage) { StackTraceElement[] trace = Thread.currentThread().getStackTrace(); printMethodTrace(trace, extraMessage); } private static void printMethodTrace(StackTraceElement[] trace, String extraMessage) { StackTraceElement caller = trace[3]; String className = caller.getClassName(); className = className.substring(className.lastIndexOf(".") + 1); String message = String.format("%s.%s(%s:%d)", className, caller.getMethodName(), caller.getFileName(), caller.getLineNumber()); if(extraMessage != null) message += ": " + extraMessage; System.out.println(message); } public static String safeClassName(Object obj) { return obj != null ? obj.getClass().getSimpleName() : ""; } public static String toStringWithClass(Object obj) { return obj != null ? String.valueOf(obj) + " " + obj.getClass().getSimpleName() : "null"; } /** * Prints the values of javabean properties to the console. * This method is not recursive, it does not print nested properties. * * Example of usage: * * IResource resource = ...; * DebugUtil.printObjectProperties(resource); * DebugUtil.printObjectProperties(resource.getResourceAttributes()); * @since 5.1 */ public static void printObjectProperties(Object obj) { try { System.out.println("Object: " + obj); BeanInfo info = Introspector.getBeanInfo(obj.getClass()); for(PropertyDescriptor propertyDescriptor : info.getPropertyDescriptors()) { Method getter = propertyDescriptor.getReadMethod(); try { System.out.println(" " + getter.getName() + "=" + getter.invoke(obj, new Object[0])); } catch (Exception e) {} } } catch (IntrospectionException e) {} } }