1 16 package scriptella.driver.ldap; 17 18 import scriptella.expression.PropertiesSubstitutor; 19 import scriptella.spi.ParametersCallback; 20 import scriptella.spi.QueryCallback; 21 22 import javax.naming.NamingEnumeration ; 23 import javax.naming.NamingException ; 24 import javax.naming.directory.Attribute ; 25 import javax.naming.directory.Attributes ; 26 import javax.naming.directory.DirContext ; 27 import javax.naming.directory.SearchResult ; 28 import java.util.logging.Level ; 29 import java.util.logging.Logger ; 30 31 42 public class SearchFilterQuery implements ParametersCallback { 43 private static final Logger LOG = Logger.getLogger(SearchFilterQuery.class.getName()); 44 private QueryCallback queryCallback; 45 46 private SearchResult result; 47 private final LdapConnection connection; 48 private final PropertiesSubstitutor substitutor; 49 50 51 58 public SearchFilterQuery(final LdapConnection connection, final ParametersCallback parameters, 59 final QueryCallback queryCallback) { 60 61 this.queryCallback = queryCallback; 62 this.connection = connection; 63 this.substitutor = new PropertiesSubstitutor(parameters); 64 } 65 66 public Object getParameter(final String name) { 67 final Attributes attributes = result.getAttributes(); 68 final Attribute attribute = attributes.get(name); 69 if (attribute != null) { 70 try { 71 return attribute.get(); } catch (NamingException e) { 73 throw new LdapProviderException("Failed to get attribute " + name + " value", e); 74 } 75 } else if ("dn".equalsIgnoreCase(name)) { 76 return result.getNameInNamespace(); } 78 return substitutor.getParameters().getParameter(name); 79 } 80 81 88 public void execute(final String filter) { 89 final String sFilter = substitutor.substitute(filter); 91 if (LOG.isLoggable(Level.FINE)) { 92 LOG.fine("Running a query for search filter " + sFilter); 93 } 94 try { 95 iterate(query(connection, sFilter)); 96 } catch (NamingException e) { 97 throw new LdapProviderException("Failed to execute query", e); 98 } catch (LdapProviderException e2) { 99 if (e2.getErrorStatement() != null) { 101 e2.setErrorStatement(sFilter); 102 } 103 throw e2; 104 } 105 } 106 107 110 private void iterate(NamingEnumeration <SearchResult > ne) { 111 try { 112 while (ne.hasMoreElements()) { 113 result = ne.nextElement(); 114 if (LOG.isLoggable(Level.FINE)) { 115 LOG.fine("Processing search result: " + result); 116 } 117 queryCallback.processRow(this); } 119 } finally { 120 try { ne.close(); 122 } catch (Exception e) { 123 LOG.log(Level.FINE, "Failed to close naming enumeration", e); 124 } 125 } 126 } 127 128 protected NamingEnumeration <SearchResult > query(final LdapConnection connection, final String filter) throws NamingException { 129 NamingEnumeration <SearchResult > en = connection.getCtx().search(connection.getBaseDn(), filter, connection.getSearchControls()); 130 connection.getStatementCounter().statements++; 131 return en; 132 } 133 134 135 } 136 | Popular Tags |