All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scriptella.driver.ldap.LdapConnection Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2006-2012 The Scriptella Project Team.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package scriptella.driver.ldap;

import scriptella.spi.AbstractConnection;
import scriptella.spi.ConnectionParameters;
import scriptella.spi.DriverContext;
import scriptella.spi.ParametersCallback;
import scriptella.spi.ProviderException;
import scriptella.spi.QueryCallback;
import scriptella.spi.Resource;
import scriptella.util.IOUtils;

import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import java.io.IOException;
import java.io.Reader;
import java.util.Hashtable;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Represents a connection to a directory context.
 * 

For configuration details and examples see overview page. * * @author Fyodor Kupolov * @version 1.0 */ public class LdapConnection extends AbstractConnection { private static final Logger LOG = Logger.getLogger(LdapConnection.class.getName()); private DirContext ctx; private final SearchControls searchControls; //default search controls private final Long maxFileLength; private final String baseDn; private final DriverContext driverContext; /** * Name of the Search scope connection property. *

The value must be one of the: object, onelevel, subtree * * @see SearchControls#setSearchScope(int) */ public static final String SEARCH_SCOPE_KEY = "search.scope"; /** * Name of the Search base DN connection property. * * @see DirContext#search(String,javax.naming.directory.Attributes) */ public static final String SEARCH_BASEDN_KEY = "search.basedn"; /** * Name of the Time Limit connection property. *

The value must be integer. * * @see SearchControls#setTimeLimit(int) */ public static final String SEARCH_TIMELIMIT_KEY = "search.timelimit"; /** * Name of the Count Limit(maximum number of entries to be returned) * connection property. *

The value must be integer. * * @see SearchControls#setCountLimit(long) */ public static final String SEARCH_COUNTLIMIT_KEY = "search.countlimit"; /** * Names of the Max File Length connection property. *

This property specifies the maximum size in Kb of the external files referenced from LDIFs. * The default value is 10000 (10MB) */ public static final String FILE_MAXLENGTH_KEY = "file.maxlength"; public LdapConnection() { this.searchControls = null; this.maxFileLength = null; this.baseDn = null; this.driverContext = null; } /** * Creates a connnection to a directory. * * @param parameters parameters to establish connection. */ public LdapConnection(ConnectionParameters parameters) { super(Driver.DIALECT, parameters); Hashtable env = new Hashtable(); //Put default settings env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); //Put connection settings if (parameters.getUrl() == null) { throw new LdapProviderException("Connection URL is required"); } env.put(Context.PROVIDER_URL, parameters.getUrl()); if (parameters.getUser() != null) { env.put(Context.SECURITY_PRINCIPAL, parameters.getUser()); } if (parameters.getPassword() != null) { env.put(Context.SECURITY_CREDENTIALS, parameters.getPassword()); } //Override env with user specified connection properties env.putAll(parameters.getProperties()); //Set the search controls used for queries searchControls = new SearchControls(); String scope = parameters.getStringProperty(SEARCH_SCOPE_KEY); if (scope != null) { if ("object".equalsIgnoreCase(scope)) { searchControls.setSearchScope(SearchControls.OBJECT_SCOPE); } else if ("onelevel".equalsIgnoreCase(scope)) { searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); } else if ("subtree".equalsIgnoreCase(scope)) { searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE); } else { throw new LdapProviderException("Unsupported " + SEARCH_SCOPE_KEY + "=" + scope); } } String baseDn = parameters.getStringProperty(SEARCH_BASEDN_KEY); this.baseDn = baseDn == null ? "" : baseDn; Integer tl = parameters.getIntegerProperty(SEARCH_TIMELIMIT_KEY); if (tl != null) { searchControls.setTimeLimit(tl); } Integer cl = parameters.getIntegerProperty(SEARCH_COUNTLIMIT_KEY); if (cl != null) { searchControls.setCountLimit(cl); } Number mfl = parameters.getNumberProperty(FILE_MAXLENGTH_KEY, null); maxFileLength = mfl == null ? null : mfl.longValue(); driverContext = parameters.getContext(); initializeContext(env); //Initializing context } /** * Creates a directory context. * * @param env environment to create initial context. */ protected void initializeContext(Hashtable env) { if (LOG.isLoggable(Level.FINE)) { LOG.fine("Creating initial context, environment: " + env); } try { ctx = new InitialDirContext(env); } catch (NamingException e) { throw new LdapProviderException("Unable to establish directory connection", e); } } DirContext getCtx() { return ctx; } SearchControls getSearchControls() { return searchControls; } Long getMaxFileLength() { return maxFileLength; } DriverContext getDriversContext() { return driverContext; } String getBaseDn() { return baseDn; } StatementCounter getStatementCounter() { return counter; } public void executeScript(final Resource scriptContent, final ParametersCallback parametersCallback) throws ProviderException { Reader in; try { in = scriptContent.open(); } catch (IOException e) { throw new LdapProviderException("Failed to read script", e); } new LdifScript(this).execute(in, ctx, parametersCallback); } public void executeQuery(final Resource queryContent, final ParametersCallback parametersCallback, final QueryCallback queryCallback) throws ProviderException { String filter; try { filter = IOUtils.toString(queryContent.open()).trim(); } catch (IOException e) { throw new LdapProviderException("Failed to read query filter", e); } SearchFilterQuery q = new SearchFilterQuery(this, parametersCallback, queryCallback); q.execute(filter); } public void close() throws ProviderException { if (ctx != null) { try { ctx.close(); ctx = null; } catch (NamingException e) { throw new LdapProviderException("Unable to close directory context", e); } } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy