/*
* Created on Aug 25, 2004
*/
package cyrille.jndi;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;
import javax.naming.Binding;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
/**
* @author <a href="mailto:cleclerc@pobox.com">Cyrille Le Clerc </a>
*/
public class DumpJndiServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private int MAX_DEPTH = 8;
/**
*
*/
public DumpJndiServlet() {
super();
}
/**
* @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse)
*/
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String jndiHost = request.getParameter("jndiHost");
String jndiPort = request.getParameter("jndiPort");
Properties propsContext = new Properties();
String providerUrl;
if (StringUtils.isBlank(jndiHost)) {
providerUrl = "iiop:///";
} else if (StringUtils.isBlank(jndiPort)) {
providerUrl = "iiop://" + jndiHost + "/";
} else {
providerUrl = "iiop://" + jndiHost + ":" + jndiPort + "/";
}
propsContext.put(Context.PROVIDER_URL, "iiop://" + (jndiHost == null ? "/" : jndiHost));
InitialContext cx = new InitialContext(propsContext);
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
out.write("parameters to invoke the servlet\r\n");
out.write("jndiHost optional default iiop:/// \r\n");
out.write("jndiPort optional default to iiop://<jndiHost>/\r\n");
out.write("providerUrl=" + providerUrl + "\r\n");
dumpContext(cx, "", 0, out);
} catch (Exception e) {
throw new ServletException(e.getMessage(), e);
}
}
/**
* Recursive method to dump a JNDI tree
*
* @param cx
* @param indent
* for display
*/
private void dumpContext(Context cx, String indent, int depth, PrintWriter out) {
NamingEnumeration enu;
try {
enu = cx.listBindings("");
} catch (NamingException e) {
e.printStackTrace(out);
return;
}
while (enu.hasMoreElements()) {
Binding binding = (Binding) enu.nextElement();
if (binding != null) {
Object o = binding.getObject();
if (o instanceof Context) {
if (depth > this.MAX_DEPTH && !("jdbc".equals(binding.getName()))) {
// Websphere 4.0.4 recursive context work around
out.println(indent + "+- " + binding.getName() + "- recursive context");
} else {
out.println(indent + "+- " + binding.getName());
dumpContext((Context) o, indent + "| ", ++depth, out);
}
} else {
out.println(indent + "+- " + binding.getName() + "=" + (o == null ? "null" : o.getClass().getName()) + "\t" + o);
}
} else {
out.println(indent + "+- #null binding#");
}
}
}
}