001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 * 019 */ 020package org.apache.directory.ldap.client.api; 021 022 023import static org.apache.directory.api.ldap.model.message.ResultCodeEnum.processResponse; 024 025import java.util.concurrent.atomic.AtomicInteger; 026 027import org.apache.directory.api.ldap.codec.api.LdapApiService; 028import org.apache.directory.api.ldap.codec.api.LdapApiServiceFactory; 029import org.apache.directory.api.ldap.model.exception.LdapException; 030import org.apache.directory.api.ldap.model.message.BindRequest; 031import org.apache.directory.api.ldap.model.message.BindRequestImpl; 032import org.apache.directory.api.ldap.model.message.BindResponse; 033import org.apache.directory.api.ldap.model.message.Control; 034import org.apache.directory.api.ldap.model.name.Dn; 035import org.apache.directory.api.ldap.model.schema.SchemaManager; 036import org.apache.directory.api.util.StringConstants; 037import org.apache.directory.api.util.Strings; 038import org.apache.mina.core.service.IoHandlerAdapter; 039import org.slf4j.Logger; 040import org.slf4j.LoggerFactory; 041 042 043/** 044 * An abstract LdapConnection class gathering the common behavior of LdapConnection 045 * concrete classes. 046 * 047 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> 048 */ 049public abstract class AbstractLdapConnection extends IoHandlerAdapter implements LdapConnection 050{ 051 /** logger for reporting errors that might not be handled properly upstream */ 052 private static final Logger LOG = LoggerFactory.getLogger( AbstractLdapConnection.class ); 053 054 /** the schema manager */ 055 protected SchemaManager schemaManager; 056 057 /** A Message ID which is incremented for each operation */ 058 protected AtomicInteger messageId; 059 060 /** the ldap codec service */ 061 protected LdapApiService codec; 062 063 064 /** 065 * Creates a new instance of an AbstractLdapConnection 066 */ 067 protected AbstractLdapConnection() 068 { 069 this( LdapApiServiceFactory.getSingleton() ); 070 } 071 072 protected AbstractLdapConnection( LdapApiService codec ) 073 { 074 messageId = new AtomicInteger( 0 ); 075 this.codec = codec; 076 } 077 078 079 /** 080 * {@inheritDoc} 081 */ 082 public void bind( Dn name ) throws LdapException 083 { 084 byte[] credBytes = StringConstants.EMPTY_BYTES; 085 086 BindRequest bindRequest = new BindRequestImpl(); 087 bindRequest.setDn( name ); 088 bindRequest.setCredentials( credBytes ); 089 090 BindResponse bindResponse = bind( bindRequest ); 091 092 processResponse( bindResponse ); 093 } 094 095 096 /** 097 * {@inheritDoc} 098 */ 099 public void bind( String name ) throws LdapException 100 { 101 LOG.debug( "Bind request : {}", name ); 102 103 bind( new Dn( schemaManager, name ), null ); 104 } 105 106 107 /** 108 * {@inheritDoc} 109 */ 110 public void bind( String name, String credentials ) throws LdapException 111 { 112 bind( new Dn( schemaManager, name ), credentials ); 113 } 114 115 116 /** 117 * {@inheritDoc} 118 */ 119 public void bind( Dn name, String credentials ) throws LdapException 120 { 121 byte[] credBytes = ( credentials == null ? StringConstants.EMPTY_BYTES : Strings.getBytesUtf8( credentials ) ); 122 123 BindRequest bindRequest = new BindRequestImpl(); 124 bindRequest.setDn( name ); 125 bindRequest.setCredentials( credBytes ); 126 127 BindResponse bindResponse = bind( bindRequest ); 128 129 processResponse( bindResponse ); 130 } 131 132 133 /** 134 * Create a complete BindRequest ready to be sent. 135 */ 136 protected BindRequest createBindRequest( String name, byte[] credentials, String saslMechanism, Control... controls ) 137 throws LdapException 138 { 139 // Set the new messageId 140 BindRequest bindRequest = new BindRequestImpl(); 141 142 // Set the version 143 bindRequest.setVersion3( true ); 144 145 // Set the name 146 bindRequest.setName( name ); 147 148 // Set the credentials 149 if ( Strings.isEmpty( saslMechanism ) ) 150 { 151 // Simple bind 152 bindRequest.setSimple( true ); 153 bindRequest.setCredentials( credentials ); 154 } 155 else 156 { 157 // SASL bind 158 bindRequest.setSimple( false ); 159 bindRequest.setCredentials( credentials ); 160 bindRequest.setSaslMechanism( saslMechanism ); 161 } 162 163 // Add the controls 164 if ( ( controls != null ) && ( controls.length != 0 ) ) 165 { 166 bindRequest.addAllControls( controls ); 167 } 168 169 return bindRequest; 170 } 171}