29 September 2016

Blick in das JNDI …

Manchmal muss man einfach in einen vorhanden JNDI reinschauen, um herauszufinden, was dort eigentlich auf Entdeckung schlummert. Die folgende Klasse liefert einen formatierten Baum aus den JNDI-Eintragungen.

package de.kaiserpfalzedv.office.common.jndi;

import javax.naming.InitialContext;
import javax.naming.NameClassPair;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * A small utlitiy class to print the JNDI tree.
 *
 * @author klenkes {@literal <rlichti@kaiserpfalz-edv.de>}
 * @version 1.0.0
 * @since 2016-09-29
 */
public class JndiWalker {
  private static final Logger LOG = LoggerFactory.getLogger(JndiWalker.class);

  /**
    * Walks the {@link InitialContext} with the entry point given and returns a string containing all sub entries.
    *
    * @param context The initial context to be printed.
    * @param entryPoint The node to start with.
    * @return A string containing the tree of the initial context (nodes including the leaves).
    * @throws NamingException If the lookup failes for some unknown reason.
    */
  public String walk(final InitialContext context, final String entryPoint) throws NamingException {
    StringBuffer sb = new StringBuffer(" JNDI tree for '").append(entryPoint).append("': ");

    LOG.trace("JNDI-Walker activated for entry point '{}' on: {}", entryPoint, context);
    walk(sb, context, entryPoint, 0);

    return sb.toString();
  }

  private void walk(
          StringBuffer sb,
          final InitialContext context,
          final String name,
          final int level
  ) throws NamingException {
    NamingEnumeration ne;
    try {
      ne = context.list(name);
    } catch (NamingException e) {
      LOG.trace("Reached leaf of JNDI: {}", name);
      return;
    }

    while (ne.hasMoreElements()) {
      NameClassPair ncp = (NameClassPair) ne.nextElement();

      printLevel(sb, level);

      sb
          .append(ncp.getName())
          .append(" (").append(ncp.getClassName())
          .append(", ").append(getNameInNamespace(ncp))
          .append(", ").append(getRelativeFlag(ncp))
          .append(")");

      walk(sb, context, name + "/" + ncp.getName(), level + 4);
    }
  }

  private void printLevel(StringBuffer sb, int level) {
    sb.append("\n");
    for (int i=0; i < level; i++) {
      sb.append(" ");
    }
  }

  private String getNameInNamespace(NameClassPair ncp) {
    String nameInNamespace;
    try {
      nameInNamespace = ncp.getNameInNamespace();
    } catch (UnsupportedOperationException e) {
      nameInNamespace = "not-supported";
    }
    return nameInNamespace;
  }

  private String getRelativeFlag(NameClassPair ncp) {
    String isRelative;
    try {
      isRelative = ncp.isRelative() ? "relative" : "fixed";
    } catch (UnsupportedOperationException e) {
      isRelative = "not-supported";
    }
    return isRelative;
  }
}

Die Basis für diese kleine Hilfsklasse war ein Blogeintrag von Anders Rudklaer Norgaard. Ich habe sie nur Servlet-unabhängig gemacht.



Verfasst 29.09.2016 von klenkes74 in category "Deutsch", "Softwareschnipsel

Über den Autor

Wenn ich mich nicht gerade um Rollenspiele (im Besonderen TORG Eternity) kümmere, arbeite ich als IT Consultant für die Red Hat GmbH. If I'm not busy with tabletop RPGs (especially TORG Eternity), I work as IT Consultant for Red Hat.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

* Mit dem Kommentieren stimmst Du der Speicherung und Verarbeitung Deiner eingegebenen Daten zu.