docs: @Override
  	public void search(SearchExecutor se, NameClassPairCallbackHandler handler, DirContextProcessor processor) {
  		DirContext ctx = contextSource.getReadOnlyContext();
  
  		NamingEnumeration results = null;
  		RuntimeException ex = null;
  		try {
  			processor.preProcess(ctx);
  			results = se.executeSearch(ctx);
  
  			while (results.hasMore()) {
  				NameClassPair result = (NameClassPair) results.next();
  				handler.handleNameClassPair(result);
  			}
  		}
  		catch (NameNotFoundException e) {
  			// It is possible to ignore errors caused by base not found
  			if (ignoreNameNotFoundException) {
  				LOG.warn("Base context not found, ignoring: " + e.getMessage());
  			}
  			else {
  				ex = LdapUtils.convertLdapException(e);
  			}
  		}
  		catch (PartialResultException e) {
  			// Workaround for AD servers not handling referrals correctly.
  			if (ignorePartialResultException) {
  				LOG.debug("PartialResultException encountered and ignored", e);
  			}
  			else {
  				ex = LdapUtils.convertLdapException(e);
  			}
  		}
          catch(SizeLimitExceededException e) {
              if(ignoreSizeLimitExceededException) {
                  LOG.debug("SizeLimitExceededException encountered and ignored", e);
              }
              else {
                  ex = LdapUtils.convertLdapException(e);
              }
          }
  		catch (javax.naming.NamingException e) {
  			ex = LdapUtils.convertLdapException(e);
  		}
  		finally {
  			try {
  				processor.postProcess(ctx);
  			}
  			catch (javax.naming.NamingException e) {
  				if (ex == null) {
  					ex = LdapUtils.convertLdapException(e);
  				}
  				else {
  					// We already had an exception from above and should ignore
  					// this one.
  					LOG.debug("Ignoring Exception from postProcess, " + "main exception thrown instead", e);
  				}
  			}
  			closeContextAndNamingEnumeration(ctx, results);
  			// If we got an exception it should be thrown.
  			if (ex != null) {
  				throw ex;
  			}
  		}
  	}