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 }