/* * SSSync, a Simple and Stupid Synchronizer for data with multi-valued attributes * Copyright (C) 2014 Ludovic Pouzenc * * This file is part of SSSync. * * SSSync is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * SSSync is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with SSSync. If not, see */ package data.io.ldap; import java.io.Closeable; import java.io.IOException; import com.unboundid.ldap.sdk.BindResult; import com.unboundid.ldap.sdk.LDAPConnection; import com.unboundid.ldap.sdk.LDAPConnectionOptions; import com.unboundid.ldap.sdk.LDAPException; import com.unboundid.ldap.sdk.ResultCode; /** * TODO javadoc * * @author lpouzenc */ public class LDAPConnectionWrapper implements Closeable { private final LDAPConnection conn; /** * TODO javadoc * @param host * @param port * @param bindDN * @param password */ public LDAPConnectionWrapper(String host, int port, String bindDN, String password) { LDAPConnectionOptions options = new LDAPConnectionOptions(); options.setAbandonOnTimeout(true); options.setAllowConcurrentSocketFactoryUse(true); options.setAutoReconnect(true); options.setCaptureConnectStackTrace(true); options.setConnectTimeoutMillis(2000); // 2 seconds options.setResponseTimeoutMillis(5000); // 5 seconds options.setUseSynchronousMode(false); BindResult bindResult=null; try { conn = new LDAPConnection(options, host, port); bindResult = conn.bind(bindDN, password); } catch (LDAPException e) { throw new RuntimeException(e); } ResultCode resultCode = bindResult.getResultCode(); if ( resultCode != ResultCode.SUCCESS ) { throw new RuntimeException("LDAP Bind failed : " + resultCode); } } /** * Builds a new reader against current connection and a LDAP baseDN. * * @param dataSourceName Short name of this data source (for logging) * @param baseDN Search base DN (will return childs of this DN) * @param keyAttr Attribute name that is the primary key of the entry, identifying the entry in a unique manner * @param lookAheadAmount Grab this amount of entries at once (in memory-sorted, 128 could be great) * @return A new reader ready to iterate on search results */ public LDAPFlatDataReader newFlatReader(String dataSourceName, String baseDN, String keyAttr, int lookAheadAmount) { try { return new LDAPFlatDataReader(dataSourceName, conn, baseDN, keyAttr, lookAheadAmount); } catch (LDAPException e) { throw new RuntimeException(e); } } /** * Builds a new writer that could insert/update/delete entries on a particular LDAP connection and baseDN. * * @param baseDN Search base DN (will return childs of this DN) * @param keyAttr Attribute name that is the primary key of the entry, identifying the entry in a unique manner * @return A new writter limited on a particular baseDN */ public LDAPFlatDataWriter newFlatWriter(String baseDN, String keyAttr) { try { return new LDAPFlatDataWriter(conn, baseDN, keyAttr); } catch (LDAPException e) { throw new RuntimeException(e); } } /** * Close the current ldap connection. */ @Override public void close() throws IOException { this.conn.close(); } }