From 98e4db9ae5f9750265b7868290d35aec3fc839b6 Mon Sep 17 00:00:00 2001 From: Mattias Hellborg Arthursson Date: Mon, 18 Nov 2013 11:51:14 +0100 Subject: [PATCH] LDAP-264: Handle SizeLimitException explicitly, ignoring and aborting unless explicitly specified otherwise. --- .../ldap/core/LdapTemplate.java | 28 ++++++++++++++-- .../itest/LdapTemplateSearchCountITest.xls | Bin 11776 -> 0 bytes .../itest/LdapTemplateSearchResultITest.java | 30 ++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) delete mode 100644 test/integration-tests/src/test/java/org/springframework/ldap/itest/LdapTemplateSearchCountITest.xls diff --git a/core/src/main/java/org/springframework/ldap/core/LdapTemplate.java b/core/src/main/java/org/springframework/ldap/core/LdapTemplate.java index cf44eac2..3a875c11 100644 --- a/core/src/main/java/org/springframework/ldap/core/LdapTemplate.java +++ b/core/src/main/java/org/springframework/ldap/core/LdapTemplate.java @@ -37,6 +37,7 @@ import javax.naming.NameClassPair; import javax.naming.NameNotFoundException; import javax.naming.NamingEnumeration; import javax.naming.PartialResultException; +import javax.naming.SizeLimitExceededException; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.ModificationItem; @@ -81,6 +82,8 @@ public class LdapTemplate implements LdapOperations, InitializingBean { private boolean ignoreNameNotFoundException = false; + private boolean ignoreSizeLimitExceededException = true; + private int defaultSearchScope = SearchControls.SUBTREE_SCOPE; private int defaultTimeLimit = 0; @@ -177,6 +180,19 @@ public class LdapTemplate implements LdapOperations, InitializingBean { this.ignorePartialResultException = ignore; } + /** + * Specify whether SizeLimitExceededException should be ignored in searches. + * This is typically what you want if you specify count limit in your search controls. + * + * @param ignore true if SizeLimitExceededException + * should be ignored in searches, false otherwise. Default is + * true. + * @since 2.0 + */ + public void setIgnoreSizeLimitExceededException(boolean ignore) { + this.ignoreSizeLimitExceededException = ignore; + } + /** * Set the default scope to be used in searches if not explicitly specified. * Default is {@link SearchControls.SUBTREE_SCOPE}. @@ -379,6 +395,14 @@ public class LdapTemplate implements LdapOperations, InitializingBean { 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); } @@ -1714,8 +1738,8 @@ public class LdapTemplate implements LdapOperations, InitializingBean { searchControls.setCountLimit(query.countLimit()); } - if(query.countLimit() != null) { - searchControls.setCountLimit(query.timeLimit()); + if(query.timeLimit() != null) { + searchControls.setTimeLimit(query.timeLimit()); } return searchControls; } diff --git a/test/integration-tests/src/test/java/org/springframework/ldap/itest/LdapTemplateSearchCountITest.xls b/test/integration-tests/src/test/java/org/springframework/ldap/itest/LdapTemplateSearchCountITest.xls deleted file mode 100644 index a7f7e40c0663e9e9ea892ec76fa2bd8b167de5e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11776 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 Dm!0&% diff --git a/test/integration-tests/src/test/java/org/springframework/ldap/itest/LdapTemplateSearchResultITest.java b/test/integration-tests/src/test/java/org/springframework/ldap/itest/LdapTemplateSearchResultITest.java index 416521c9..5d87a422 100644 --- a/test/integration-tests/src/test/java/org/springframework/ldap/itest/LdapTemplateSearchResultITest.java +++ b/test/integration-tests/src/test/java/org/springframework/ldap/itest/LdapTemplateSearchResultITest.java @@ -22,6 +22,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.dao.IncorrectResultSizeDataAccessException; import org.springframework.ldap.NameNotFoundException; +import org.springframework.ldap.SizeLimitExceededException; +import org.springframework.ldap.core.ContextMapper; import org.springframework.ldap.core.DirContextAdapter; import org.springframework.ldap.core.DirContextOperations; import org.springframework.ldap.core.LdapTemplate; @@ -33,6 +35,7 @@ import org.springframework.ldap.test.AttributeCheckContextMapper; import org.springframework.test.context.ContextConfiguration; import javax.naming.Name; +import javax.naming.NamingException; import javax.naming.directory.SearchControls; import java.util.List; @@ -388,4 +391,31 @@ public class LdapTemplateSearchResultITest extends AbstractLdapTemplateIntegrati contextMapper); assertEquals(0, list.size()); } + + @Test + public void verifyThatSearchWithCountLimitReturnsTheEntriesFoundSoFar() { + List result = tested.search(query() + .countLimit(3) + .where("objectclass").is("person"), new ContextMapper() { + @Override + public Object mapFromContext(Object ctx) throws NamingException { + return new Object(); + } + }); + + assertEquals(3, result.size()); + } + + @Test(expected = SizeLimitExceededException.class) + public void verifyThatSearchWithCountLimitWithFlagToFalseThrowsException() { + tested.setIgnoreSizeLimitExceededException(false); + tested.search(query() + .countLimit(3) + .where("objectclass").is("person"), new ContextMapper() { + @Override + public Object mapFromContext(Object ctx) throws NamingException { + return new Object(); + } + }); + } }