/*
* 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.test.web.util;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Date;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.LinkRef;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.NameClassPair;
import javax.naming.NameParser;
/** A trivial utility class that is placed into the lib/util.jar directory
* of the war archive and used by servlets in the war to test access to the
* lib jars.
*
* @author Scott.Stark@jboss.org
* @version $Revision: 81036 $
*/
public class Util
{
static org.jboss.logging.Logger log =
org.jboss.logging.Logger.getLogger(Util.class);
public static String getTime()
{
return new Date().toString();
}
public static URL configureLog4j()
{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
URL webPropsURL = loader.getResource("weblog4j.properties");
URL web2PropsURL = loader.getResource("web2log4j.properties");
URL propsURL = loader.getResource("log4j.properties");
System.out.println("getResource('weblog4j.properties') via TCL = "+webPropsURL);
System.out.println("getResource('web2log4j.properties') via TCL = "+web2PropsURL);
System.out.println("getResource('log4j.properties') via TCL = "+propsURL);
URL webPropsURL2 = Util.class.getResource("/weblog4j.properties");
URL web2PropsURL2 = Util.class.getResource("/web2log4j.properties");
URL propsURL2 = Util.class.getResource("/log4j.properties");
System.out.println("getResource('/weblog4j.properties') via CL = "+webPropsURL2);
System.out.println("getResource('web2log4j.properties') via CL = "+web2PropsURL2);
System.out.println("getResource('/log4j.properties') via CL = "+propsURL2);
return propsURL;
}
public static void showTree(String indent, Context ctx, PrintWriter out)
throws NamingException
{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
NamingEnumeration enumeration = ctx.list("");
while( enumeration.hasMoreElements() )
{
NameClassPair ncp = (NameClassPair)enumeration.next();
String name = ncp.getName();
out.print(indent + " +- " + name);
boolean recursive = false;
boolean isLinkRef = false;
try
{
Class c = loader.loadClass(ncp.getClassName());
if( Context.class.isAssignableFrom(c) )
recursive = true;
if( LinkRef.class.isAssignableFrom(c) )
isLinkRef = true;
}
catch(ClassNotFoundException cnfe)
{
}
if( isLinkRef )
{
try
{
LinkRef link = (LinkRef) ctx.lookupLink(name);
out.print("[link -> ");
out.print(link.getLinkName());
out.print(']');
}
catch(Throwable e)
{
log.debug("failed", e);
out.print("[invalid]");
}
}
out.println();
if( recursive )
{
try
{
Object value = ctx.lookup(name);
if( value instanceof Context )
{
Context subctx = (Context) value;
showTree(indent + " | ", subctx, out);
}
else
{
out.println(indent + " | NonContext: "+value);
}
}
catch(Throwable t)
{
out.println("Failed to lookup: "+name+", errmsg="+t.getMessage());
}
}
}
}
public static void dumpClassLoader(ClassLoader cl, PrintWriter out)
{
int level = 0;
while( cl != null )
{
String msg = "Servlet ClassLoader["+level+"]: "+cl.getClass().getName()+':'+cl.hashCode();
out.println(msg);
URL[] urls = getClassLoaderURLs(cl);
msg = " URLs:";
out.println(msg);
for(int u = 0; u < urls.length; u ++)
{
msg = " ["+u+"] = "+urls[u];
out.println(msg);
}
cl = cl.getParent();
level ++;
}
}
public static void dumpENC(PrintWriter out) throws NamingException
{
InitialContext iniCtx = new InitialContext();
Context enc = (Context) iniCtx.lookup("java:comp/env");
showTree("", enc, out);
}
public static String displayClassLoaders(ClassLoader cl) throws NamingException
{
StringWriter sw = new StringWriter();
PrintWriter out = new PrintWriter(sw);
dumpClassLoader(cl, out);
return sw.toString();
}
public static String displayENC() throws NamingException
{
StringWriter sw = new StringWriter();
PrintWriter out = new PrintWriter(sw);
dumpENC(out);
return sw.toString();
}
/** Use reflection to access a URL[] getURLs method so that non-URLClassLoader
*class loaders that support this method can provide info.
*/
private static URL[] getClassLoaderURLs(ClassLoader cl)
{
URL[] urls = {};
try
{
Class returnType = urls.getClass();
Class[] parameterTypes = {};
Method getURLs = cl.getClass().getMethod("getURLs", parameterTypes);
if( returnType.isAssignableFrom(getURLs.getReturnType()) )
{
Object[] args = {};
urls = (URL[]) getURLs.invoke(cl, args);
}
}
catch(Exception ignore)
{
}
return urls;
}
}