001    package org.crsh.util;
002    
003    import org.crsh.text.formatter.BindingRenderable;
004    
005    import javax.naming.Binding;
006    import javax.naming.Context;
007    import javax.naming.InitialContext;
008    import javax.naming.NamingEnumeration;
009    import java.util.ArrayList;
010    import java.util.List;
011    import java.util.regex.Pattern;
012    
013    /** @author <a href="mailto:alain.defrance@exoplatform.com">Alain Defrance</a> */
014    public class JNDIHandler {
015    
016      public static List<BindingRenderable.BindingData> lookup(List<String> filters, String name, Boolean verbose) {
017    
018        Pattern pattern = null;
019        if (name != null) {
020          pattern = Pattern.compile("^" + Utils.globexToRegex(name) + "$");
021        }
022    
023        List<BindingRenderable.BindingData> data = new ArrayList<BindingRenderable.BindingData>();
024    
025        data.addAll(get(filters, pattern, verbose, ""));
026        data.addAll(get(filters, pattern, verbose, "java:/"));
027        data.addAll(get(filters, pattern, verbose, "java:comp/env/jdbc"));
028        data.addAll(get(filters, pattern, verbose, "java:jboss"));
029        data.addAll(get(filters, pattern, verbose, "java:global"));
030        data.addAll(get(filters, pattern, verbose, "java:app"));
031        data.addAll(get(filters, pattern, verbose, "java:module"));
032    
033        return data;
034    
035      }
036    
037      static List<BindingRenderable.BindingData> get(
038          List<String> filters,
039          Pattern pattern,
040          Boolean verbose,
041          String path) {
042    
043        return get(filters, pattern, verbose, path, path, null);
044      }
045    
046      static List<BindingRenderable.BindingData> get(
047          List<String> filters,
048          Pattern pattern,
049          Boolean verbose,
050          String path,
051          String search,
052          Context ctx) {
053    
054        List<BindingRenderable.BindingData> data = new ArrayList<BindingRenderable.BindingData>();
055    
056        try {
057          if (ctx == null) {
058            ctx = new InitialContext();
059          }
060          if (path.length() > 0) {
061            path += "/";
062          }
063    
064          NamingEnumeration<Binding> e = ctx.listBindings(search);
065          while (e.hasMoreElements()) {
066            Binding instance = e.next();
067    
068            String fullName = path + instance.getName();
069    
070            if (
071                filters == null ||
072                    filters.size() == 0 ||
073                    TypeResolver.instanceOf(instance.getObject().getClass(), filters)) {
074              if (pattern == null || pattern.matcher(fullName).find()) {
075                data.add(new BindingRenderable.BindingData(fullName, instance.getClassName(), verbose));
076              }
077            }
078            if (instance.getObject() instanceof Context) {
079              data.addAll(get(filters, pattern, verbose, fullName, "", (Context)instance.getObject()));
080            }
081    
082          }
083    
084        }
085        catch (Exception e) {
086        }
087    
088        return data;
089      }
090    
091    }