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

com.novell.ldapchai.provider.ApacheLdapProviderImpl Maven / Gradle / Ivy

package com.novell.ldapchai.provider;

import com.novell.ldapchai.ChaiConstant;
import com.novell.ldapchai.ChaiRequestControl;
import com.novell.ldapchai.exception.ChaiError;
import com.novell.ldapchai.exception.ChaiOperationException;
import com.novell.ldapchai.exception.ChaiUnavailableException;
import com.novell.ldapchai.util.ChaiLogger;
import com.novell.ldapchai.util.SearchHelper;
import org.apache.directory.api.ldap.model.cursor.CursorException;
import org.apache.directory.api.ldap.model.cursor.EntryCursor;
import org.apache.directory.api.ldap.model.cursor.SearchCursor;
import org.apache.directory.api.ldap.model.entry.Attribute;
import org.apache.directory.api.ldap.model.entry.BinaryValue;
import org.apache.directory.api.ldap.model.entry.DefaultAttribute;
import org.apache.directory.api.ldap.model.entry.DefaultEntry;
import org.apache.directory.api.ldap.model.entry.DefaultModification;
import org.apache.directory.api.ldap.model.entry.Entry;
import org.apache.directory.api.ldap.model.entry.Modification;
import org.apache.directory.api.ldap.model.entry.ModificationOperation;
import org.apache.directory.api.ldap.model.entry.StringValue;
import org.apache.directory.api.ldap.model.entry.Value;
import org.apache.directory.api.ldap.model.exception.LdapException;
import org.apache.directory.api.ldap.model.message.AddRequest;
import org.apache.directory.api.ldap.model.message.AddRequestImpl;
import org.apache.directory.api.ldap.model.message.AddResponse;
import org.apache.directory.api.ldap.model.message.Control;
import org.apache.directory.api.ldap.model.message.DeleteRequest;
import org.apache.directory.api.ldap.model.message.DeleteRequestImpl;
import org.apache.directory.api.ldap.model.message.DeleteResponse;
import org.apache.directory.api.ldap.model.message.MessageTypeEnum;
import org.apache.directory.api.ldap.model.message.ModifyRequest;
import org.apache.directory.api.ldap.model.message.ModifyRequestImpl;
import org.apache.directory.api.ldap.model.message.ModifyResponse;
import org.apache.directory.api.ldap.model.message.ResultCodeEnum;
import org.apache.directory.api.ldap.model.message.ResultResponse;
import org.apache.directory.api.ldap.model.message.SearchRequest;
import org.apache.directory.api.ldap.model.message.SearchRequestImpl;
import org.apache.directory.api.ldap.model.message.SearchScope;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.ldap.client.api.LdapConnection;
import org.apache.directory.ldap.client.api.LdapConnectionConfig;
import org.apache.directory.ldap.client.api.LdapNetworkConnection;

import javax.naming.ldap.ExtendedRequest;
import javax.naming.ldap.ExtendedResponse;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class ApacheLdapProviderImpl extends AbstractProvider implements ChaiProviderImplementor {

  private static final ChaiLogger LOGGER = ChaiLogger.getLogger(ApacheLdapProviderImpl.class.getName());

  private String currentLdapUrl;

  private LdapConnection connection;

  public Object getConnectionObject() throws Exception {
    return null;
  }

  public String getCurrentConnectionURL() {
    return null;
  }

  @Override
  public Map getProviderProperties() {
    return super.getProviderProperties();
  }

  public ApacheLdapProviderImpl() {
    super();
  }

  @Override
  public String toString() {
    return super.toString();
  }

  @Override
  public void close() {
    super.close();
    try {
      connection.close();
    } catch (IOException e) {
      LOGGER.error("error during connection close: " + e.getMessage());
    }
  }

  @Override
  public ChaiConfiguration getChaiConfiguration() {
    return super.getChaiConfiguration();
  }

  @Override
  public ConnectionState getConnectionState() {
    return super.getConnectionState();
  }

  @Override
  public void init(final ChaiConfiguration chaiConfig) throws ChaiUnavailableException {
    this.chaiConfig = chaiConfig;
    super.init(chaiConfig);

    // grab the first URL from the list.
    currentLdapUrl = chaiConfig.bindURLsAsList().get(0);
    final URI ldapURL = URI.create(currentLdapUrl);

    final LdapConnectionConfig ldapConnectionConfig = new LdapConnectionConfig();
    ldapConnectionConfig.setLdapHost(ldapURL.getHost());
    ldapConnectionConfig.setLdapPort(ldapURL.getPort());

    if (ldapURL.getScheme().equalsIgnoreCase("ldaps")) {
      ldapConnectionConfig.setUseSsl(true);
      final boolean usePromiscuousSSL = Boolean.parseBoolean(chaiConfig.getSetting(ChaiSetting.PROMISCUOUS_SSL));
      if (usePromiscuousSSL) {
        try {
          final PromiscuousTrustManager promiscuousTrustManager = new PromiscuousTrustManager();
          ldapConnectionConfig.setTrustManagers(promiscuousTrustManager);
        } catch (Exception e) {
          LOGGER.error("error creating promiscuous ssl ldap socket factory: " + e.getMessage());
        }
      } else if (chaiConfig.getTrustManager() != null) {
        try {
          final X509TrustManager[] trustManager = chaiConfig.getTrustManager();
          ldapConnectionConfig.setTrustManagers(trustManager);
        } catch (Exception e) {
          LOGGER.error("error creating configured ssl ldap socket factory: " + e.getMessage());
        }
      }
    }

    final LdapConnection newConnection;
    try {

      newConnection = new LdapNetworkConnection(ldapConnectionConfig);
      newConnection.connect();
      final String bindPassword = chaiConfig.getSetting(ChaiSetting.BIND_PASSWORD);
      final String bindDN = chaiConfig.getSetting(ChaiSetting.BIND_DN);
      newConnection.bind(bindDN, bindPassword);
    } catch (LdapException e) {
      final String message = e.getMessage();
      if (message.contains("Cannot connect on the server")) {
        throw new ChaiUnavailableException(message, ChaiError.COMMUNICATION, false, false);
      }
      throw ChaiUnavailableException.forErrorMessage(message);
    } catch (Exception e) {
      e.printStackTrace();
      final String message = e.getMessage();
      throw new ChaiUnavailableException(message, ChaiError.UNKNOWN, false, false);
    }

    connection = newConnection;
  }

  @Override
  protected void activityPreCheck() {
    super.activityPreCheck();
  }

  @Override
  public boolean errorIsRetryable(final Exception e) {
    return super.errorIsRetryable(e);
  }

  @Override
  protected void preCheckExtendedOperation(final ExtendedRequest request) throws ChaiOperationException {
    super.preCheckExtendedOperation(request);
  }

  @Override
  protected void cacheExtendedOperationException(final ExtendedRequest request, final Exception e) throws ChaiOperationException {
    super.cacheExtendedOperationException(request, e);
  }

  @Override
  public DIRECTORY_VENDOR getDirectoryVendor() throws ChaiUnavailableException {
    return super.getDirectoryVendor();
  }

  @Override
  public String getIdentifier() {
    return super.getIdentifier();
  }

  public boolean compareStringAttribute(final String entryDN, final String attributeName, final String value) throws ChaiOperationException, ChaiUnavailableException, IllegalStateException {
    activityPreCheck();
    INPUT_VALIDATOR.compareStringAttribute(entryDN, attributeName, value);

    try {
      return connection.compare(entryDN, attributeName, value);
    } catch (LdapException e) {
      throw ChaiOperationException.forErrorMessage(e.getMessage());
    }
  }

  public void createEntry(final String entryDN, final String baseObjectClass, final Map stringAttributes) throws ChaiOperationException, ChaiUnavailableException, IllegalStateException {
    activityPreCheck();
    INPUT_VALIDATOR.createEntry(entryDN, baseObjectClass, stringAttributes);

    createEntry(entryDN, Collections.singleton(baseObjectClass), stringAttributes);
  }

  public void createEntry(final String entryDN, final Set baseObjectClasses, final Map stringAttributes) throws ChaiOperationException, ChaiUnavailableException, IllegalStateException {
    activityPreCheck();
    INPUT_VALIDATOR.createEntry(entryDN, baseObjectClasses, stringAttributes);

    try {
      final AddRequest addRequest = new AddRequestImpl();
      final Entry entry = new DefaultEntry();
      entry.setDn(entryDN);
      for (final String baseObjectClass : baseObjectClasses) {
        entry.add(ChaiConstant.ATTR_LDAP_OBJECTCLASS, baseObjectClass);
      }
      for (final String name : stringAttributes.keySet()) {
        final String value = stringAttributes.get(name);
        entry.add(name, value);
      }

      final AddResponse response = connection.add(addRequest);
      processResponse(response);
    } catch (LdapException e) {
      throw ChaiOperationException.forErrorMessage(e.getMessage());
    }
  }

  public void deleteEntry(final String entryDN) throws ChaiOperationException, ChaiUnavailableException, IllegalStateException {
    activityPreCheck();
    INPUT_VALIDATOR.deleteEntry(entryDN);

    try {
      final DeleteRequest deleteRequest = new DeleteRequestImpl();
      deleteRequest.setName(new Dn(entryDN));
      final DeleteResponse response = connection.delete(deleteRequest);
      processResponse(response);
    } catch (LdapException e) {
      throw ChaiOperationException.forErrorMessage(e.getMessage());
    }
  }

  public void deleteStringAttributeValue(final String entryDN, final String attributeName, final String value) throws ChaiOperationException, ChaiUnavailableException, IllegalStateException {
    activityPreCheck();
    INPUT_VALIDATOR.deleteStringAttributeValue(entryDN, attributeName, value);

    try {
      final ModifyRequest modifyRequest = new ModifyRequestImpl();
      modifyRequest.setName(new Dn(entryDN));
      if (value == null) {
        final Modification modification = new DefaultModification(ModificationOperation.REMOVE_ATTRIBUTE, attributeName);
        modifyRequest.addModification(modification);
      } else {
        final Modification modification = new DefaultModification();
        modification.setOperation(ModificationOperation.REMOVE_ATTRIBUTE);
        modification.setAttribute(new DefaultAttribute(attributeName, value));
      }
      final ModifyResponse response = connection.modify(modifyRequest);
      processResponse(response);
    } catch (LdapException e) {
      throw ChaiOperationException.forErrorMessage(e.getMessage());
    }
  }

  public ExtendedResponse extendedOperation(final ExtendedRequest request) throws ChaiOperationException, ChaiUnavailableException, IllegalStateException {
    final org.apache.directory.api.ldap.model.message.ExtendedRequest apacheRequest = new org.apache.directory.api.ldap.model.message.ExtendedRequest() {
      public String getRequestName() {
        return request.getID();
      }

      public org.apache.directory.api.ldap.model.message.ExtendedRequest setRequestName(final String oid) {
        return this;
      }

      public org.apache.directory.api.ldap.model.message.ExtendedRequest setMessageId(final int messageId) {
        return this;
      }

      public org.apache.directory.api.ldap.model.message.ExtendedRequest addControl(final Control control) {
        return null;
      }

      public org.apache.directory.api.ldap.model.message.ExtendedRequest addAllControls(final Control[] controls) {
        return null;
      }

      public org.apache.directory.api.ldap.model.message.ExtendedRequest removeControl(final Control control) {
        return null;
      }

      public MessageTypeEnum getResponseType() {
        return null;
      }

      public ResultResponse getResultResponse() {
        return null;
      }

      public boolean hasResponse() {
        return false;
      }

      public MessageTypeEnum getType() {
        return null;
      }

      public Map getControls() {
        return null;
      }

      public Control getControl(final String oid) {
        return null;
      }

      public boolean hasControl(final String oid) {
        return false;
      }

      public int getMessageId() {
        return 0;
      }

      public Object get(final Object key) {
        return null;
      }

      public Object put(final Object key, final Object value) {
        return null;
      }
    };
    try {
      final org.apache.directory.api.ldap.model.message.ExtendedResponse apacheResponse = connection.extended(apacheRequest);
      final ExtendedResponse extendedResponse = new ExtendedResponse() {
        public String getID() {
          return apacheResponse.getResponseName();
        }

        public byte[] getEncodedValue() {
          return null;
        }
      };
      return extendedResponse;
    } catch (LdapException e) {
      throw ChaiOperationException.forErrorMessage(e.getMessage());
    }
  }

  public ProviderStatistics getProviderStatistics() {
    return null;
  }

  public byte[][] readMultiByteAttribute(final String entryDN, final String attribute) throws ChaiOperationException, ChaiUnavailableException, IllegalStateException {
    activityPreCheck();
    INPUT_VALIDATOR.readStringAttribute(entryDN, attribute);

    final List values = readMultiAttribute(entryDN, attribute);
    if (values == null) {
      return null;
    }
    final byte[][] bytes = new byte[values.size()][];
    for (int i = 0; i < values.size(); i++) {
      bytes[i] = values.get(i).getBytes();
    }
    return bytes;
  }



  public Set readMultiStringAttribute(final String entryDN, final String attribute) throws ChaiOperationException, ChaiUnavailableException, IllegalStateException {
    activityPreCheck();
    INPUT_VALIDATOR.readStringAttribute(entryDN, attribute);

    final List values = readMultiAttribute(entryDN, attribute);
    if (values == null) {
      return Collections.emptySet();
    }
    final Set returnSet = new LinkedHashSet();
    for (final Value value : values) {
      returnSet.add(value.getString());
    }
    return Collections.unmodifiableSet(returnSet);
  }

  private List readMultiAttribute(final String entryDN, final String attribute) throws ChaiOperationException {
    try {
      final EntryCursor entries = connection.search(entryDN, ChaiConstant.FILTER_OBJECTCLASS_ANY, SearchScope.OBJECT, attribute);
      final Entry entry = entries.iterator().next();
      final List returnSet = new ArrayList();
      final Attribute attr = entry.get(attribute);
      if (attr == null) {
        return null;
      }
      for (final Value value : attr) {
        if (value != null) {
          returnSet.add(value);
        }
      }
      return Collections.unmodifiableList(returnSet);

    } catch (LdapException e) {
      throw ChaiOperationException.forErrorMessage(e.getMessage());
    }

  }

  public String readStringAttribute(final String entryDN, final String attribute) throws ChaiOperationException, ChaiUnavailableException, IllegalStateException {
    activityPreCheck();
    INPUT_VALIDATOR.readStringAttribute(entryDN, attribute);

    try {
      final EntryCursor entries = connection.search(entryDN, ChaiConstant.FILTER_OBJECTCLASS_ANY, SearchScope.OBJECT, attribute);
      final Entry entry = entries.iterator().next();
      final Attribute attr = entry.get(attribute);
      return attr == null ? null : attr.getString();

    } catch (LdapException e) {
      throw ChaiOperationException.forErrorMessage(e.getMessage());
    }
  }

  public Map readStringAttributes(final String entryDN, final Set attributes) throws ChaiOperationException, ChaiUnavailableException, IllegalStateException {
    activityPreCheck();
    INPUT_VALIDATOR.readStringAttributes(entryDN, attributes);

    try {
      final EntryCursor entries = connection.search(entryDN, ChaiConstant.FILTER_OBJECTCLASS_ANY, SearchScope.OBJECT, attributes.toArray(new String[attributes.size()]));
      final Entry entry = entries.iterator().next();
      final Collection attrs = entry.getAttributes();
      final Map returnMap = new LinkedHashMap();
      for (final Attribute attr : attrs) {
        final String name = attr.getId();
        final String value = attr.getString();
        returnMap.put(name, value);
      }

      return returnMap;

    } catch (LdapException e) {
      throw ChaiOperationException.forErrorMessage(e.getMessage());
    }
  }

  public void replaceStringAttribute(final String entryDN, final String attributeName, final String oldValue, final String newValue) throws ChaiOperationException, ChaiUnavailableException, IllegalStateException {
    activityPreCheck();
    INPUT_VALIDATOR.replaceStringAttribute(entryDN, attributeName, oldValue, newValue);

    replaceAttributeImpl(entryDN, attributeName, new StringValue(oldValue), new StringValue(newValue));
  }

  private void replaceAttributeImpl(final String entryDN, final String attributeName, final Value oldValue, final Value newValue) throws ChaiOperationException {
    try {
      final ModifyRequest modifyRequest = new ModifyRequestImpl();
      modifyRequest.setName(new Dn(entryDN));
      {
        final Modification modification = new DefaultModification();
        modification.setOperation(ModificationOperation.REMOVE_ATTRIBUTE);
        modification.setAttribute(new DefaultAttribute(attributeName, oldValue));
        modifyRequest.addModification(modification);
      }
      {
        final Modification modification = new DefaultModification();
        modification.setOperation(ModificationOperation.ADD_ATTRIBUTE);
        modification.setAttribute(new DefaultAttribute(attributeName, newValue));
        modifyRequest.addModification(modification);
      }
      final ModifyResponse response = connection.modify(modifyRequest);
      processResponse(response);
    } catch (LdapException e) {
      throw ChaiOperationException.forErrorMessage(e.getMessage());
    }
  }

  public Map> search(final String baseDN, final SearchHelper searchHelper) throws ChaiOperationException, ChaiUnavailableException, IllegalStateException {
    activityPreCheck();
    INPUT_VALIDATOR.search(baseDN, searchHelper);

    final Map>> results = searchImpl(baseDN, searchHelper, false);
    final Map> returnObj = new LinkedHashMap>();
    for (final String dn : results.keySet()) {
      final Map> entryMap = results.get(dn);
      final Map newEntryMap = new LinkedHashMap();
      for (final String attr : entryMap.keySet()) {
        final String value = entryMap.get(attr).iterator().next();
        newEntryMap.put(attr, value);
      }
      returnObj.put(dn, Collections.unmodifiableMap(newEntryMap));
    }
    return Collections.unmodifiableMap(returnObj);
  }

  public Map> search(final String baseDN, final String filter, final Set attributes, final SEARCH_SCOPE searchScope) throws ChaiOperationException, ChaiUnavailableException, IllegalStateException {
    activityPreCheck();
    INPUT_VALIDATOR.search(baseDN, filter, attributes, searchScope);

    final SearchHelper searchHelper = new SearchHelper();
    searchHelper.setFilter(filter);
    searchHelper.setAttributes(attributes);
    searchHelper.setSearchScope(searchScope);

    return search(baseDN, searchHelper);
  }

  public Map>> searchMultiValues(final String baseDN, final SearchHelper searchHelper) throws ChaiUnavailableException, ChaiOperationException {
    activityPreCheck();
    INPUT_VALIDATOR.searchMultiValues(baseDN, searchHelper);

    return searchImpl(baseDN, searchHelper, true);
  }

  public Map>> searchMultiValues(final String baseDN, final String filter, final Set attributes, final SEARCH_SCOPE searchScope) throws ChaiOperationException, ChaiUnavailableException, IllegalStateException {
    activityPreCheck();
    INPUT_VALIDATOR.searchMultiValues(baseDN, filter, attributes, searchScope);

    final SearchHelper searchHelper = new SearchHelper();
    searchHelper.setFilter(filter);
    searchHelper.setAttributes(attributes);
    searchHelper.setSearchScope(searchScope);

    return searchImpl(baseDN, searchHelper, true);
  }

  private Map>> searchImpl(final String baseDN, final SearchHelper searchHelper, final boolean multivalued) throws ChaiUnavailableException, ChaiOperationException {
    try {
      final SearchRequest searchRequest = new SearchRequestImpl();
      searchRequest.setBase(new Dn(baseDN));
      searchRequest.setFilter(searchHelper.getFilter());
      searchRequest.setScope(figureSearchScope(searchHelper.getSearchScope()));
      searchRequest.setSizeLimit(searchHelper.getMaxResults());
      searchRequest.setTimeLimit(searchHelper.getTimeLimit());

      final SearchCursor searchCursor = connection.search(searchRequest);

      final Map>> returnObj = new LinkedHashMap>>();

      while (searchCursor.next()) {
        final Entry entry = searchCursor.getEntry();
        final String dnValue = entry.getDn().getName();
        final Map> entryMap = new HashMap>();
        for (Attribute returnAttr : entry) {
          final String attrName = returnAttr.getId();
          final List valueList = new ArrayList();
          if (multivalued) {
            for (Value value : returnAttr) {
              valueList.add(value.getString());
            }
          } else {
            final String value = returnAttr.iterator().next().getString();
            valueList.add(value);
          }
          entryMap.put(attrName, Collections.unmodifiableList(valueList));
        }
        returnObj.put(dnValue, Collections.unmodifiableMap(entryMap));
      }

      return Collections.unmodifiableMap(returnObj);

    } catch (CursorException e) {
      throw ChaiOperationException.forErrorMessage(e.getMessage());
    } catch (LdapException e) {
      throw ChaiOperationException.forErrorMessage(e.getMessage());
    }
  }

  public void writeBinaryAttribute(final String entryDN, final String attributeName, final byte[][] values, final boolean overwrite) throws ChaiUnavailableException, ChaiOperationException {
    activityPreCheck();
    INPUT_VALIDATOR.writeBinaryAttribute(entryDN, attributeName, values, overwrite);

    try {
      final ModifyRequest modifyRequest = new ModifyRequestImpl();
      modifyRequest.setName(new Dn(entryDN));
      {
        final Modification modification = new DefaultModification();
        modification.setOperation(overwrite ? ModificationOperation.REPLACE_ATTRIBUTE : ModificationOperation.ADD_ATTRIBUTE);
        modification.setAttribute(new DefaultAttribute(attributeName, values));
        modifyRequest.addModification(modification);
      }
      final ModifyResponse response = connection.modify(modifyRequest);
      processResponse(response);
    } catch (LdapException e) {
      throw ChaiOperationException.forErrorMessage(e.getMessage());
    }
  }

  public void writeBinaryAttribute(final String entryDN, final String attributeName, final byte[][] values, final boolean overwrite, final ChaiRequestControl[] controls) throws ChaiUnavailableException, ChaiOperationException {
    try {
      final ModifyRequest modifyRequest = new ModifyRequestImpl();
      modifyRequest.setName(new Dn(entryDN));
      modifyRequest.addAllControls(figureControls(controls));
      {
        final Modification modification = new DefaultModification();
        modification.setOperation(overwrite ? ModificationOperation.REPLACE_ATTRIBUTE : ModificationOperation.ADD_ATTRIBUTE);
        modification.setAttribute(new DefaultAttribute(attributeName, values));
        modifyRequest.addModification(modification);
      }
      final ModifyResponse response = connection.modify(modifyRequest);
      processResponse(response);
    } catch (LdapException e) {
      throw ChaiOperationException.forErrorMessage(e.getMessage());
    }

  }

  public void writeStringAttribute(final String entryDN, final String attributeName, final Set values, final boolean overwrite) throws ChaiOperationException, ChaiUnavailableException, IllegalStateException {
    activityPreCheck();
    INPUT_VALIDATOR.writeStringAttribute(entryDN, attributeName, values, overwrite);

    try {
      final ModifyRequest modifyRequest = new ModifyRequestImpl();
      modifyRequest.setName(new Dn(entryDN));
      {
        final Modification modification = new DefaultModification();
        modification.setOperation(overwrite ? ModificationOperation.REPLACE_ATTRIBUTE : ModificationOperation.ADD_ATTRIBUTE);
        modification.setAttribute(new DefaultAttribute(attributeName, values.toArray(new String[values.size()])));
        modifyRequest.addModification(modification);
      }
      final ModifyResponse response = connection.modify(modifyRequest);
      processResponse(response);
    } catch (LdapException e) {
      throw ChaiOperationException.forErrorMessage(e.getMessage());
    }
  }

  public void writeStringAttributes(final String entryDN, final Map attributeValueProps, final boolean overwrite) throws ChaiOperationException, ChaiUnavailableException, IllegalStateException {
    activityPreCheck();
    INPUT_VALIDATOR.writeStringAttributes(entryDN, attributeValueProps, overwrite);

    try {
      final ModifyRequest modifyRequest = new ModifyRequestImpl();
      modifyRequest.setName(new Dn(entryDN));
      for (final String name : attributeValueProps.keySet()) {
        final String value = attributeValueProps.get(name);
        final Modification modification = new DefaultModification();
        modification.setOperation(overwrite ? ModificationOperation.REPLACE_ATTRIBUTE : ModificationOperation.ADD_ATTRIBUTE);
        modification.setAttribute(new DefaultAttribute(name, value));
        modifyRequest.addModification(modification);
      }
      final ModifyResponse response = connection.modify(modifyRequest);
      processResponse(response);
    } catch (LdapException e) {
      throw ChaiOperationException.forErrorMessage(e.getMessage());
    }
  }

  public void replaceBinaryAttribute(final String entryDN, final String attributeName, final byte[] oldValue, final byte[] newValue) throws ChaiUnavailableException, ChaiOperationException {
    activityPreCheck();
    INPUT_VALIDATOR.replaceBinaryAttribute(entryDN, attributeName, oldValue, newValue);

    replaceAttributeImpl(entryDN, attributeName, new BinaryValue(oldValue), new BinaryValue(newValue));
  }

  public boolean isConnected() {
    return connection != null && connection.isConnected();
  }

  private static void processResponse(final ResultResponse response) throws ChaiOperationException {
    final boolean success = response.getLdapResult().getResultCode() == ResultCodeEnum.SUCCESS;
    if (!success) {
      final String msg = response.getLdapResult().getDiagnosticMessage();
      throw ChaiOperationException.forErrorMessage(msg);
    }
  }

  private static SearchScope figureSearchScope(final ChaiProvider.SEARCH_SCOPE searchScope) {
    switch (searchScope) {
      case BASE:
        return SearchScope.OBJECT;

      case ONE:
        return SearchScope.ONELEVEL;

      case SUBTREE:
        return SearchScope.SUBTREE;

      default:
        throw new IllegalArgumentException("unknown SearchScope type");
    }
  }

  private static Control[] figureControls(final ChaiRequestControl[] chaiControls) {
    final List returnObj = new ArrayList();
    for (final ChaiRequestControl chaiControl : chaiControls) {
      final Control control = new Control() {
        public String getOid() {
          return chaiControl.getId();
        }

        public boolean isCritical() {
          return chaiControl.isCritical();
        }

        public void setCritical(final boolean isCritical) {

        }
      };
      returnObj.add(control);
    }
    return returnObj.toArray(new Control[returnObj.size()]);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy