package com.paessler.prtg.util;
import java.io.PrintStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import com.paessler.prtg.jmx.Logger;
/******************************************************************************
* A library of static Class utility functions
* @author JR Andreassen
* @version 0.1
*****************************************************************************/
public abstract class ClassUtility
{
public static final int STRING_INVALID_POSSITION = -1;
public static final char CLASS_PATH_SEPARATOR = '/';
public static final char CLASS_PACKAGE_SEPARATOR = '.';
//-----------------------------------------------------------
/**
* Load class by name
* @param classname Name of class to load
* @return
*/
public static Class<?> classForName(String classname)
{
Class<?> retVal = null;
String ssClassName = classname;
if (ssClassName != null)
{ ssClassName = ssClassName.replace(CLASS_PATH_SEPARATOR, CLASS_PACKAGE_SEPARATOR);}
try
{
retVal = Class.forName(ssClassName);
}
catch (Exception e)
{
Logger.log("(\'"+classname+"\'/\'"+ssClassName+"\') Could not find class file: Msg => " + e.getMessage());
retVal = null;
}
return retVal;
}
//-----------------------------------------------------------
/**
* Get sub Array
* @param ch_arr Array to slice
* @param start Starting Index
* @param len Length
* @return String String representation of the character
*/
public static Object newInstance(Class<?> objclass, Object[] args)
{
Object retVal = null;
if(objclass != null)
{
try
{
//Class[] parameterTypes = new Class[2];
//parameterTypes[0] = Class.forName("com.dbwiz.ui.AppFrame");
//parameterTypes[1] = Class.forName("java.lang.Integer");
//Constructor c = panelClass.getConstructor(parameterTypes);
// The only public constructor takes an af and int -GSI
Constructor c[] = objclass.getConstructors();
//protected AppPanel(String primaryTbleName, AppFrame af, int mode)
//for classed with multiple constructors, try them all
// for( int i=0; i < c.length; i++)
for(Constructor curr : c)
{
//if the constructor has a different number of arguments.. skip it
//we're only looking for the ones with (String tableName, AppFrame af, int mode)
Class<?>[] paramTypeArr = curr.getParameterTypes();
if( paramTypeArr.length != args.length )
continue;
try
{
retVal = curr.newInstance(args);
break;
}
catch(java.lang.IllegalArgumentException ex)
{
// Logger.printDebug("ClassUtility.newInstance("+objclass.getName()+", arg) IllegalArgumentException -> Class not accessible e->" + ex);
Logger.log("ClassUtility.newInstance("+objclass.getName()+", arg) IllegalArgumentException -> Class not accessible e->" + ex);
ex.printStackTrace();
}
}//for
}
catch(InvocationTargetException e)
{
// Logger.printDebug("ClassUtility.classForName() -> Constructor invocation failed e->" + e);
e.getTargetException().printStackTrace();
}
catch(IllegalAccessException e)
{
// Logger.printDebug("ClassUtility.classForName() -> Class not accessible e->" + e);
e.printStackTrace();
}
catch(InstantiationException e)
{
// Logger.printDebug("ClassUtility.classForName():InstantiationException trying to clone an abstract class? e->" + e);
e.printStackTrace();
}
} // if(objclass != null)
return retVal;
}
//-----------------------------------------------------------
/**
* Get sub Array
* @param ch_arr Array to slice
* @param start Starting Index
* @param len Length
* @return String String representation of the character
*/
public static Object newInstanceForName(String classname, Object[] args)
{
Object retVal = null;
Class<?> objclass = classForName(classname);
if(objclass != null)
{
try
{
//Class[] parameterTypes = new Class[2];
//parameterTypes[0] = Class.forName("com.dbwiz.ui.AppFrame");
//parameterTypes[1] = Class.forName("java.lang.Integer");
//Constructor c = panelClass.getConstructor(parameterTypes);
// The only public constructor takes an af and int -GSI
Constructor c[] = objclass.getConstructors();
//protected AppPanel(String primaryTbleName, AppFrame af, int mode)
//for classed with multiple constructors, try them all
// for( int i=0; i < c.length; i++)
for(Constructor curr : c)
{
//if the constructor has a different number of arguments.. skip it
//we're only looking for the ones with (String tableName, AppFrame af, int mode)
Class<?>[] paramTypeArr = curr.getParameterTypes();
if( paramTypeArr.length != args.length )
continue;
try
{
retVal = curr.newInstance(args);
break;
}
catch(java.lang.IllegalArgumentException ex)
{
Logger.log("ClassUtility.newInstanceForName("+objclass.getName()+", arg) IllegalArgumentException -> Class not accessible e->" + ex);
ex.printStackTrace();
}
}//for
}
catch(InvocationTargetException e)
{
Logger.log("ClassUtility.classForName() -> Constructor invocation failed e->" + e);
e.getTargetException().printStackTrace();
}
catch(IllegalAccessException e)
{
Logger.log("ClassUtility.classForName() -> Class not accessible e->" + e);
e.printStackTrace();
}
catch(InstantiationException e)
{
Logger.log("ClassUtility.classForName():InstantiationException trying to clone an abstract class? e->" + e);
e.printStackTrace();
}
} // if(objclass != null)
return retVal;
}
//-----------------------------------------------------------
/**
* Create a new Instance for Name
* @param classname name of class
* @return
*/
public static Object newInstanceForName(String classname)
{
String ssClassName = classname;
if (ssClassName != null)
{ ssClassName = ssClassName.replace(CLASS_PATH_SEPARATOR, CLASS_PACKAGE_SEPARATOR);}
Object retVal = null;
try
{
Class<?> clazz = Class.forName(ssClassName);
retVal = clazz.newInstance();
}
catch (Exception e)
{
Logger.log("(\'"+classname+"\'/\'"+ssClassName+"\') Could not find class file: Msg => " + e.getMessage());
retVal = null;
}
return retVal;
}
//-----------------------------------------------------------
/**
* Dump Class info
* @param dest Output destination
* @param classobj Class object to dump
*/
public static void dumpHierarchy(PrintStream dest, Class<?> classobj)
{
if (classobj != null)
{
String name = classobj.getName();
dest.println("Name: "+name);
dest.println(" Interfaces");
arrayDump(dest, classobj.getInterfaces());
if (!name.equals("java.lang.Object"))
{
dumpHierarchy(dest, classobj.getSuperclass());
}
}
}
//-----------------------------------------------------------
/**
* Get sub Array
* @param ch_arr Array to slice
* @param start Starting Index
* @param len Length
* @return String String representation of the character
*/
public static void arrayDump(PrintStream dest, Object[] arr)
{ if(arr != null)
{
synchronized(dest)
{
for(int i= 0; i < arr.length; i++)
{
dest.println("arr["+i+"]="+arr[i]);
} // for
} // synchronized(dest)
} // if
} // dump()
//-----------------------------------------------------------
/**
* Dump Class info
* @param dest Output destination
* @param classobj Class object to dump
*/
public static void dumpClassInfo(PrintStream dest, Class<?> classobj)
{
try
{
// dest.println("Name " + classobj.getName());
dest.println("Class Hierarchy ");
dumpHierarchy(dest, classobj);
dest.println("Methods");
arrayDump(dest, classobj.getMethods());
dest.println("DeclaredFields");
arrayDump(dest, classobj.getDeclaredFields());
}
catch (Exception e)
{
Logger.log(""+e.getMessage());
}
}
//-----------------------------------------------------------
//###########################################################
//-----------------------------------------------------------
/**
* Get Class Name (Without path)
* @param classobj Object to get name for
*/
public static String getClassName(String classname)
{
String retVal = null;
if(classname != null)
{
retVal = classname;
int idx = retVal.lastIndexOf('.');
if(idx != STRING_INVALID_POSSITION)
{ retVal = retVal.substring(idx+1);}
}
return retVal;
}
//-----------------------------------------------------------
/**
* Get Class Path (Without name)
* @param classname Object to get path for
*/
public static String getClassPath(String classname)
{
String retVal = null;
if(classname != null)
{
retVal = classname;
int idx = retVal.lastIndexOf('.');
if(idx != STRING_INVALID_POSSITION)
{ retVal = retVal.substring(0, idx);}
}
return retVal;
}
//-----------------------------------------------------------
/**
* Get Class Name (Without path)
* @param classobj Object to get name for
*/
public static String getClassName(Class<?> classobj)
{ return getClassName(classobj.getName()); }
//-----------------------------------------------------------
/**
* Get Class Path (Without name)
* @param classobj Object to get name for
*/
public static String getClassPath(Class<?> classobj)
{ return getClassPath(classobj.getName()); }
//-----------------------------------------------------------
//-----------------------------------------------------------
/* public static void main(String[] args)
{
System.out.println("Calling getClassPath()"+getClassPath(ClassUtility.class));
System.out.println("Calling getClassName()"+getClassName(ClassUtility.class));
}
*/
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
} // class