private static void rlist(NamingContext ctx, NameComponent[] base, StringBuffer buf) {
    BindingListHolder listHolder = new BindingListHolder(new Binding[0]);
    BindingIteratorHolder iterHolder = new BindingIteratorHolder();
    ctx.list(0, listHolder, iterHolder);
    BindingHolder bindingHolder = new BindingHolder();

    if (iterHolder.value == null) return;

    NameComponent[] name = new NameComponent[base.length + 1];
    for (int i = 0; i < base.length; i++) name[i] = base[i];

    while (iterHolder.value.next_one(bindingHolder)) {
      Binding binding = bindingHolder.value;
      name[name.length - 1] = binding.binding_name[0];
      try {
        String stringName = namingService.to_string(name);
        buf.append(stringName);
      } catch (Exception e) {
        buf.append(e.getMessage());
      }

      if (binding.binding_type.value() == BindingType._ncontext) {
        // this entry is for a subcontext
        // add trailing '/' just to distinguish
        // a subcontext from a regular object
        buf.append('/');
        buf.append('\n');

        // recursively list the subcontext contents
        try {
          NamingContext subCtx = NamingContextHelper.narrow(ctx.resolve(binding.binding_name));
          rlist(subCtx, name, buf);
        } catch (Exception e) {
          buf.append(e.getMessage());
        }
      } else {
        buf.append('\n');
      }
    }
  }