You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by at...@apache.org on 2010/04/01 13:19:13 UTC

svn commit: r929928 - in /portals/jetspeed-2/portal/trunk: components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/ components/jetspeed-securi...

Author: ate
Date: Thu Apr  1 11:19:12 2010
New Revision: 929928

URL: http://svn.apache.org/viewvc?rev=929928&view=rev
Log:
JS2-1171: Provide LDAP search paging and callback handling support
See: http://issues.apache.org/jira/browse/JS2-1171

Added:
    portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/SearchResultCallbackHandler.java   (with props)
    portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/AbstractSearchResultHandler.java   (with props)
    portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/CollectingSearchResultHandler.java   (with props)
    portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/CountingSearchResultHandler.java   (with props)
    portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ldap/dao/impl/PagedSearchExecutor.java   (with props)
Removed:
    portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ldap/dao/CollectingBindingsCallbackHandler.java
    portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ldap/dao/DefaultEntityContextMapper.java
    portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ldap/dao/EntityContextMapper.java
Modified:
    portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ldap/dao/impl/SpringLDAPEntityDAO.java
    portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/test/java/org/apache/jetspeed/security/mapping/ldap/AbstractLDAPTest.java
    portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/security-ldap.xml

Added: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/SearchResultCallbackHandler.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/SearchResultCallbackHandler.java?rev=929928&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/SearchResultCallbackHandler.java (added)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/SearchResultCallbackHandler.java Thu Apr  1 11:19:12 2010
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jetspeed.security.mapping;
+
+/**
+ * @author <a href="mailto:ate@douma.nu>Ate Douma</a>
+ * @version $Id$
+ */
+public interface SearchResultCallbackHandler
+{
+    boolean handleSearchResult(Object result, int pageSize, int pageIndex, int index);
+}

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/SearchResultCallbackHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/SearchResultCallbackHandler.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/SearchResultCallbackHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/AbstractSearchResultHandler.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/AbstractSearchResultHandler.java?rev=929928&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/AbstractSearchResultHandler.java (added)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/AbstractSearchResultHandler.java Thu Apr  1 11:19:12 2010
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jetspeed.security.mapping.impl;
+
+import org.apache.jetspeed.security.mapping.SearchResultCallbackHandler;
+
+/**
+ * @author <a href="mailto:ate@douma.nu>Ate Douma</a>
+ * @version $Id$
+ */
+public abstract class AbstractSearchResultHandler implements SearchResultCallbackHandler
+{
+    private final int maxCount;
+    private int count;
+    private int size;
+    private boolean aborted;
+        
+    public AbstractSearchResultHandler()
+    {
+        this(Integer.MAX_VALUE);
+    }
+    
+    public AbstractSearchResultHandler(int maxCount)
+    {
+        this.maxCount = maxCount < 1 ? Integer.MAX_VALUE : maxCount;
+    }
+
+    public final boolean handleSearchResult(Object result, int pageSize, int pageIndex, int index)
+    {
+        count++;
+        if (!aborted)
+        {
+            boolean noExceptions = false;
+            try
+            {
+                processSearchResult(result, pageSize, pageIndex, index);
+                noExceptions = true;
+            }
+            finally
+            {
+                if (!noExceptions)
+                {
+                    aborted = true;
+                }
+            }
+            if (!aborted)
+            {
+                size++;
+                if (count > maxCount)
+                {
+                    aborted = true;
+                }
+            }
+        }
+        return !aborted;
+    }
+    
+    public final boolean isAborted()
+    {
+        return aborted;
+    }
+    
+    protected final void setAborted()
+    {
+        aborted = true;
+    }
+    
+    public final int getMaxCount()
+    {
+        return maxCount;
+    }
+    
+    public final int getCount()
+    {
+        return count;
+    }
+    
+    public final int getSize()
+    {
+        return size;
+    }
+    
+    protected abstract void processSearchResult(Object result, int pageSize, int pageIndex, int index);
+}

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/AbstractSearchResultHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/AbstractSearchResultHandler.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/AbstractSearchResultHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/CollectingSearchResultHandler.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/CollectingSearchResultHandler.java?rev=929928&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/CollectingSearchResultHandler.java (added)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/CollectingSearchResultHandler.java Thu Apr  1 11:19:12 2010
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jetspeed.security.mapping.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * @author <a href="mailto:ate@douma.nu>Ate Douma</a>
+ * @version $Id$
+ */
+public class CollectingSearchResultHandler<T,R> extends AbstractSearchResultHandler
+{
+    private T singleResult;
+    private List<T> results;
+        
+    public CollectingSearchResultHandler()
+    {
+        super();
+    }
+    
+    public CollectingSearchResultHandler(List<T> results)
+    {
+        super();
+        this.results = results;
+    }
+    
+    public CollectingSearchResultHandler(int maxSize)
+    {
+        super(maxSize);
+    }
+
+    public CollectingSearchResultHandler(int maxSize, List<T> results)
+    {
+        super(maxSize);
+        this.results = results;
+    }
+
+    public T getSingleResult()
+    {
+        return singleResult;
+    }
+    
+    public List<T> getResults()
+    {
+        if (results == null)
+        {
+            results = new ArrayList<T>();
+        }
+        return results;
+    }
+
+    @SuppressWarnings("unchecked")
+    protected void processSearchResult(Object result, int pageSize, int pageIndex, int index)
+    {
+        T mappedResult = mapResult((R)result);
+        if (getMaxCount() == 1)
+        {
+            singleResult = mappedResult;
+        }
+        else if (getCount() <= getMaxCount())
+        {
+            getResults().add(mappedResult);
+        }
+    }
+    
+    @SuppressWarnings("unchecked")
+    protected T mapResult(R result)
+    {
+        return (T)result;
+    }
+}

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/CollectingSearchResultHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/CollectingSearchResultHandler.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/CollectingSearchResultHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/CountingSearchResultHandler.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/CountingSearchResultHandler.java?rev=929928&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/CountingSearchResultHandler.java (added)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/CountingSearchResultHandler.java Thu Apr  1 11:19:12 2010
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jetspeed.security.mapping.impl;
+
+
+/**
+ * @author <a href="mailto:ate@douma.nu>Ate Douma</a>
+ * @version $Id$
+ */
+public class CountingSearchResultHandler extends AbstractSearchResultHandler
+{
+    public CountingSearchResultHandler()
+    {
+        super();
+    }
+    
+    public CountingSearchResultHandler(int maxSize)
+    {
+        super(maxSize);
+    }
+
+    protected void processSearchResult(Object result, int pageSize, int pageIndex, int index)
+    {
+        // do nothing
+    }
+}

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/CountingSearchResultHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/CountingSearchResultHandler.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/impl/CountingSearchResultHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ldap/dao/impl/PagedSearchExecutor.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ldap/dao/impl/PagedSearchExecutor.java?rev=929928&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ldap/dao/impl/PagedSearchExecutor.java (added)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ldap/dao/impl/PagedSearchExecutor.java Thu Apr  1 11:19:12 2010
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jetspeed.security.mapping.ldap.dao.impl;
+
+import javax.naming.Name;
+import javax.naming.NameClassPair;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+
+import org.apache.jetspeed.security.mapping.SearchResultCallbackHandler;
+import org.springframework.ldap.control.PagedResultsCookie;
+import org.springframework.ldap.control.PagedResultsDirContextProcessor;
+import org.springframework.ldap.core.NameClassPairCallbackHandler;
+import org.springframework.ldap.core.SearchExecutor;
+import org.springframework.ldap.support.LdapUtils;
+
+/**
+ * @author <a href="mailto:ate@douma.nu>Ate Douma</a>
+ * @version $Id$
+ */
+public class PagedSearchExecutor implements SearchExecutor, NameClassPairCallbackHandler
+{
+    private static final NamingEnumeration<SearchResult> noResultsEnumeration = new NamingEnumeration<SearchResult>()
+    {
+        public void close() throws NamingException {}
+        public boolean hasMore() throws NamingException { return false; }
+        public SearchResult next() throws NamingException { return null; }
+        public boolean hasMoreElements() { return false; }
+        public SearchResult nextElement() { return null; }
+    };
+    
+    private String base;
+    private Name baseName;
+    private String filter;
+    private SearchControls controls;
+    private SearchResultCallbackHandler handler;
+    private int pageSize;
+    
+    protected PagedSearchExecutor(String filter, SearchControls controls, SearchResultCallbackHandler handler, int pageSize)
+    {
+        this.filter = filter;
+        this.controls = controls;
+        this.handler = handler;
+        this.pageSize = pageSize;
+    }
+    
+    public PagedSearchExecutor(String base, String filter, SearchControls controls, SearchResultCallbackHandler handler)
+    {
+        this(base, filter, controls, handler, -1);
+    }
+
+    public PagedSearchExecutor(Name baseName, String filter, SearchControls controls, SearchResultCallbackHandler handler)
+    {
+        this(baseName, filter, controls, handler, -1);
+    }
+    
+    public PagedSearchExecutor(String base, String filter, SearchControls controls, SearchResultCallbackHandler handler, int pageSize)
+    {
+        this(filter, controls, handler, pageSize);
+        this.base = base;
+    }
+
+    public PagedSearchExecutor(Name baseName, String filter, SearchControls controls, SearchResultCallbackHandler handler, int pageSize)
+    {
+        this(filter, controls, handler, pageSize);
+        this.baseName = baseName;
+    }
+    
+    public NamingEnumeration<SearchResult> executeSearch(DirContext ctx) throws NamingException
+    {
+        NamingEnumeration<SearchResult> results = null;
+        PagedResultsDirContextProcessor processor = null;
+        boolean noExceptions = false;
+        try
+        {
+            PagedResultsCookie cookie = null;
+            int index = 0;
+            boolean doNext = true;
+            if (pageSize > 0)
+            {
+                do
+                {
+                    processor = new PagedResultsDirContextProcessor(pageSize, cookie);
+                    processor.preProcess(ctx);
+                    results = base != null ? ctx.search(base, filter, controls) : ctx.search(baseName, filter, controls);
+                    int pageIndex = 0;
+                    while (doNext && results.hasMore())
+                    {
+                        doNext = handler.handleSearchResult(results.next(), pageSize, pageIndex++, index++);
+                    }                
+                    processor.postProcess(ctx);
+                    cookie = processor.getCookie();
+                }
+                while (doNext && cookie != null && cookie.getCookie() != null && cookie.getCookie().length != 0);
+            }
+            else
+            {
+                results = base != null ? ctx.search(base, filter, controls) : ctx.search(baseName, filter, controls);
+                int pageIndex = 0;
+                while (doNext && results.hasMore())
+                {
+                    doNext = handler.handleSearchResult(results.next(), pageSize, pageIndex++, index++);
+                }                
+            }
+            noExceptions = true;
+        }
+        finally
+        {
+            if (results != null)
+            {
+                try 
+                {
+                    results.close();
+                }
+                catch (Exception e)
+                {
+                    // Never mind
+                }
+            }
+            if (processor != null)
+            {
+                try
+                {
+                    processor.postProcess(ctx);
+                }
+                catch (NamingException e)
+                {
+                    if (noExceptions)
+                    {   
+                        throw LdapUtils.convertLdapException(e);
+                    }
+                    else
+                    {
+                        // ignore as we already have one
+                    }
+                }
+            }
+        }
+        return noResultsEnumeration;
+    }
+
+    public void handleNameClassPair(NameClassPair nameClassPair)
+    {
+        // ignored
+    }
+}

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ldap/dao/impl/PagedSearchExecutor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ldap/dao/impl/PagedSearchExecutor.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ldap/dao/impl/PagedSearchExecutor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ldap/dao/impl/SpringLDAPEntityDAO.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ldap/dao/impl/SpringLDAPEntityDAO.java?rev=929928&r1=929927&r2=929928&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ldap/dao/impl/SpringLDAPEntityDAO.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/mapping/ldap/dao/impl/SpringLDAPEntityDAO.java Thu Apr  1 11:19:12 2010
@@ -21,21 +21,19 @@ import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 
-import javax.naming.Binding;
 import javax.naming.directory.Attributes;
 import javax.naming.directory.BasicAttribute;
 import javax.naming.directory.BasicAttributes;
 import javax.naming.directory.DirContext;
 import javax.naming.directory.ModificationItem;
 import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.jetspeed.security.SecurityException;
 import org.apache.jetspeed.security.mapping.EntityFactory;
+import org.apache.jetspeed.security.mapping.impl.CollectingSearchResultHandler;
 import org.apache.jetspeed.security.mapping.ldap.EntityFactoryImpl;
-import org.apache.jetspeed.security.mapping.ldap.dao.CollectingBindingsCallbackHandler;
-import org.apache.jetspeed.security.mapping.ldap.dao.EntityContextMapper;
-import org.apache.jetspeed.security.mapping.ldap.dao.DefaultEntityContextMapper;
 import org.apache.jetspeed.security.mapping.ldap.dao.EntityDAO;
 import org.apache.jetspeed.security.mapping.ldap.dao.LDAPEntityDAOConfiguration;
 import org.apache.jetspeed.security.mapping.model.Attribute;
@@ -47,10 +45,8 @@ import org.springframework.ldap.NameNotF
 import org.springframework.ldap.NamingException;
 import org.springframework.ldap.SchemaViolationException;
 import org.springframework.ldap.core.DirContextOperations;
-import org.springframework.ldap.core.DirContextProcessor;
 import org.springframework.ldap.core.DistinguishedName;
 import org.springframework.ldap.core.LdapTemplate;
-import org.springframework.ldap.core.simple.SimpleLdapTemplate;
 import org.springframework.ldap.filter.AndFilter;
 import org.springframework.ldap.filter.EqualsFilter;
 import org.springframework.ldap.filter.Filter;
@@ -62,24 +58,15 @@ import org.springframework.ldap.filter.O
  */
 public class SpringLDAPEntityDAO implements EntityDAO
 {
-    private static final DirContextProcessor nullDirContextProcessor = new DirContextProcessor()
-    {
-        public void postProcess(DirContext ctx) throws javax.naming.NamingException{}
-        public void preProcess(DirContext ctx) throws javax.naming.NamingException{}
-    };
-
     private final LDAPEntityDAOConfiguration configuration;
     private final EntityFactory              entityFactory;
-    private EntityContextMapper              contextMapper;
     private LdapTemplate                     ldapTemplate;
-    private SimpleLdapTemplate               simpleLdapTemplate;
     private String                           defaultSearchFilterStr;
 
     public SpringLDAPEntityDAO(LDAPEntityDAOConfiguration configuration)
     {
         this.configuration = configuration;
         this.entityFactory = new EntityFactoryImpl(configuration);
-        this.contextMapper = new DefaultEntityContextMapper(entityFactory);
         this.defaultSearchFilterStr = createSearchFilter(null);
     }
 
@@ -87,11 +74,6 @@ public class SpringLDAPEntityDAO impleme
     {
         return configuration;
     }
-
-    protected EntityContextMapper getContextMapper()
-    {
-        return contextMapper;
-    }
     
     public String getEntityType()
     {
@@ -103,28 +85,30 @@ public class SpringLDAPEntityDAO impleme
         return entityFactory;
     }
     
-    public void setEntityContextMapper(EntityContextMapper contextMapper)
+    public void setLdapTemplate(LdapTemplate ldapTemplate)
     {
-        this.contextMapper = contextMapper;
-    }
-
-    public void setLdapTemplate(SimpleLdapTemplate simpleLdapTemplate)
-    {
-        this.simpleLdapTemplate = simpleLdapTemplate;
-        this.ldapTemplate = (LdapTemplate)simpleLdapTemplate.getLdapOperations();
+        this.ldapTemplate = ldapTemplate;
     }
 
     public Collection<Entity> getEntities(Filter filter) throws SecurityException
     {
-        String filterStr = createSearchFilter(filter);
-        Collection<Entity> results = null;
+        String sf = createSearchFilter(filter);
+        SearchControls sc = getSearchControls(SearchControls.SUBTREE_SCOPE, true, configuration.getEntityAttributeNames());
+        CollectingSearchResultHandler<Entity,SearchResult> cbh = new CollectingSearchResultHandler<Entity,SearchResult>()
+        {
+            protected Entity mapResult(SearchResult result)
+            {
+                return getEntityFactory().loadEntity(result.getObject());
+            }
+        };
+        PagedSearchExecutor pse = new PagedSearchExecutor(configuration.getSearchDN(), sf, sc, cbh);
+        
         ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
         try
         {
             Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
-            results = simpleLdapTemplate.search(configuration.getSearchDN(), filterStr, 
-                                                getSearchControls(SearchControls.SUBTREE_SCOPE, true,configuration.getEntityAttributeNames()), 
-                                                getContextMapper(), nullDirContextProcessor);
+            ldapTemplate.search(pse,pse); 
+            return cbh.getResults();
         }
         catch (NamingException e)
         {
@@ -134,24 +118,32 @@ public class SpringLDAPEntityDAO impleme
         {
             Thread.currentThread().setContextClassLoader(currentClassLoader);
         }
-        return results;
     }
 
     public Collection<Entity> getEntities(Entity parent, Filter filter) throws SecurityException
     {
-        String filterStr = createSearchFilter(filter);
-        Collection<Entity> results = null;
+        List<Entity> results = new ArrayList<Entity>();
         ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
         DistinguishedName parentDN = getRelativeDN(parent.getInternalId());
         if (configuration.getSearchDN().size() == 0 || parentDN.endsWith(configuration.getSearchDN()))
         {
+            String sf = createSearchFilter(filter);
+            SearchControls sc = getSearchControls(SearchControls.ONELEVEL_SCOPE, true, configuration.getEntityAttributeNames());
+            CollectingSearchResultHandler<Entity,SearchResult> cbh = new CollectingSearchResultHandler<Entity,SearchResult>(results)
+            {
+                protected Entity mapResult(SearchResult result)
+                {
+                    return getEntityFactory().loadEntity(result.getObject());
+                }
+            };
+            PagedSearchExecutor pse = new PagedSearchExecutor(parentDN, sf, sc, cbh);
+            
             try
             {
                 Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
-                results = simpleLdapTemplate.search(parentDN, filterStr, 
-                                                    getSearchControls(SearchControls.ONELEVEL_SCOPE, true,configuration.getEntityAttributeNames()), 
-                                                    getContextMapper(), nullDirContextProcessor);
-                            }
+                
+                ldapTemplate.search(pse, pse);
+            }
             catch (NamingException e)
             {
                 throw new SecurityException(SecurityException.UNEXPECTED.create(getClass().getName(), "getEntities", e.getMessage()), e);
@@ -192,20 +184,28 @@ public class SpringLDAPEntityDAO impleme
 
     public Entity getEntityByInternalId(String internalId) throws SecurityException
     {
-        Entity resultEntity = null;
         DistinguishedName principalDN = getRelativeDN(internalId);
         if (configuration.getSearchDN().size() == 0 || principalDN.endsWith(configuration.getSearchDN()))
         {
+            SearchControls sc = getSearchControls(SearchControls.OBJECT_SCOPE, true, configuration.getEntityAttributeNames());
+            CollectingSearchResultHandler<Entity,SearchResult> cbh = new CollectingSearchResultHandler<Entity,SearchResult>(1)
+            {
+                protected Entity mapResult(SearchResult result)
+                {
+                    return getEntityFactory().loadEntity(result.getObject());
+                }
+            };
+            PagedSearchExecutor pse = new PagedSearchExecutor(principalDN, defaultSearchFilterStr, sc, cbh);
+            
             ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
             try
             {
                 Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
-                List<Entity> result = simpleLdapTemplate.search(principalDN, defaultSearchFilterStr, 
-                                                                getSearchControls(SearchControls.OBJECT_SCOPE, true, configuration.getEntityAttributeNames()), 
-                                                                getContextMapper(), nullDirContextProcessor);
-                if (!result.isEmpty())
+                
+                ldapTemplate.search(pse,pse);
+                if (cbh.getCount() == 1)
                 {
-                    resultEntity = result.get(0);
+                    return cbh.getSingleResult();
                 }
             }
             catch (NamingException e)
@@ -217,7 +217,7 @@ public class SpringLDAPEntityDAO impleme
                 Thread.currentThread().setContextClassLoader(currentClassLoader);
             }
         }
-        return resultEntity;
+        return null;
     }
     
     public Collection<Entity> getEntitiesByInternalId(Collection<String> internalIds) throws SecurityException
@@ -252,14 +252,26 @@ public class SpringLDAPEntityDAO impleme
 
     public String getInternalId(String entityId, boolean required) throws SecurityException
     {
-        String filterStr = createSearchFilter(new EqualsFilter(configuration.getLdapIdAttribute(), entityId));
+        String sf = createSearchFilter(new EqualsFilter(configuration.getLdapIdAttribute(), entityId));
+        SearchControls sc = getSearchControls(SearchControls.SUBTREE_SCOPE, false, new String[0]);
+        CollectingSearchResultHandler<String,SearchResult> cbh = 
+            new CollectingSearchResultHandler<String,SearchResult>(1)
+        {
+            protected String mapResult(SearchResult result)
+            {
+                return result.getNameInNamespace();
+            }
+        };
+        PagedSearchExecutor pse = new PagedSearchExecutor(configuration.getSearchDN(), sf, sc, cbh);
+        
         ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
         try
         {
             Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
-            CollectingBindingsCallbackHandler handler = new CollectingBindingsCallbackHandler();
-            ldapTemplate.search(configuration.getSearchDN(), filterStr, getSearchControls(SearchControls.SUBTREE_SCOPE, false, new String[0]), handler);
-            if (handler.getList().isEmpty() || handler.getList().size() != 1)
+            
+            ldapTemplate.search(pse,pse);
+            
+            if (cbh.getCount() != 1)
             {
                 if (required)
                 {
@@ -267,7 +279,7 @@ public class SpringLDAPEntityDAO impleme
                 }
                 return null;
             }
-            return ((Binding)handler.getList().get(0)).getNameInNamespace();
+            return cbh.getSingleResult();
         }
         catch (NamingException e)
         {
@@ -293,18 +305,30 @@ public class SpringLDAPEntityDAO impleme
 
     protected DirContextOperations getEntityContextById(String entityId, boolean withAttributes) throws SecurityException
     {
+        String sf = createSearchFilter(new EqualsFilter(configuration.getLdapIdAttribute(), entityId));
+        SearchControls sc = getSearchControls(SearchControls.SUBTREE_SCOPE, true, 
+                                              withAttributes ? configuration.getEntityAttributeNames() : new String[0]);
+        CollectingSearchResultHandler<DirContextOperations,SearchResult> cbh = 
+            new CollectingSearchResultHandler<DirContextOperations,SearchResult>(1)
+        {
+            protected DirContextOperations mapResult(SearchResult result)
+            {
+                return (DirContextOperations)result.getObject();
+            }
+        };
+        PagedSearchExecutor pse = new PagedSearchExecutor(configuration.getSearchDN(), sf, sc, cbh);
+        
         ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
         try
         {
             Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
-            CollectingBindingsCallbackHandler handler = new CollectingBindingsCallbackHandler();
-            ldapTemplate.search(configuration.getSearchDN(), createSearchFilter(new EqualsFilter(configuration.getLdapIdAttribute(), entityId)),
-                                getSearchControls(SearchControls.SUBTREE_SCOPE, true, withAttributes ? configuration.getEntityAttributeNames() : new String[0]), 
-                                handler);
-            if (!handler.getList().isEmpty() && handler.getList().size() == 1)
+
+            ldapTemplate.search(pse, pse);
+            if (cbh.getCount() == 1)
             {
-                return (DirContextOperations)((Binding)handler.getList().get(0)).getObject();
+                return cbh.getSingleResult();
             }
+            return null;
         }
         catch (NamingException e)
         {
@@ -314,7 +338,6 @@ public class SpringLDAPEntityDAO impleme
         {
             Thread.currentThread().setContextClassLoader(currentClassLoader);
         }
-        return null;
     }
 
     protected DirContextOperations getEntityContextByInternalId(String internalId, boolean withAttributes) throws SecurityException
@@ -322,17 +345,28 @@ public class SpringLDAPEntityDAO impleme
         DistinguishedName principalDN = getRelativeDN(internalId);
         if (configuration.getSearchDN().size() == 0 || principalDN.endsWith(configuration.getSearchDN()))
         {
+            String sf = createSearchFilter(null);
+            SearchControls sc = getSearchControls(SearchControls.OBJECT_SCOPE, true, 
+                                                  withAttributes ? configuration.getEntityAttributeNames() : new String[0]);
+            CollectingSearchResultHandler<DirContextOperations,SearchResult> cbh = 
+                new CollectingSearchResultHandler<DirContextOperations,SearchResult>(1)
+            {
+                protected DirContextOperations mapResult(SearchResult result)
+                {
+                    return (DirContextOperations)result.getObject();
+                }
+            };
+            PagedSearchExecutor pse = new PagedSearchExecutor(principalDN, sf, sc, cbh); 
+            
             ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
             try
             {
                 Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
-                CollectingBindingsCallbackHandler handler = new CollectingBindingsCallbackHandler();
-                ldapTemplate.search(principalDN, createSearchFilter(null),
-                                    getSearchControls(SearchControls.OBJECT_SCOPE, true, withAttributes ? configuration.getEntityAttributeNames() : new String[0]), 
-                                    handler);
-                if (!handler.getList().isEmpty())
+                
+                ldapTemplate.search(pse,pse);
+                if (cbh.getCount() == 1)
                 {
-                    return (DirContextOperations)((Binding)handler.getList().get(0)).getObject();
+                    return cbh.getSingleResult();
                 }
             }
             catch (NamingException e)

Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/test/java/org/apache/jetspeed/security/mapping/ldap/AbstractLDAPTest.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/test/java/org/apache/jetspeed/security/mapping/ldap/AbstractLDAPTest.java?rev=929928&r1=929927&r2=929928&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/test/java/org/apache/jetspeed/security/mapping/ldap/AbstractLDAPTest.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/test/java/org/apache/jetspeed/security/mapping/ldap/AbstractLDAPTest.java Thu Apr  1 11:19:12 2010
@@ -25,8 +25,10 @@ import org.apache.jetspeed.security.mapp
 import org.apache.jetspeed.test.JetspeedTestCase;
 import org.springframework.core.io.Resource;
 import org.springframework.ldap.core.ContextSource;
-import org.springframework.ldap.core.simple.SimpleLdapTemplate;
+import org.springframework.ldap.core.LdapTemplate;
 import org.springframework.ldap.core.support.LdapContextSource;
+import org.springframework.ldap.pool.factory.MutablePoolingContextSource;
+import org.springframework.ldap.pool.factory.PoolingContextSource;
 
 /**
  * @author <a href="mailto:ddam@apache.org">Dennis Dam</a>
@@ -49,7 +51,7 @@ public abstract class AbstractLDAPTest e
 
     public static final AttributeDefImpl UNIQUEMEMBER_ATTR_DEF = new AttributeDefImpl("uniqueMember",true).cfgRequired(true).cfgRequiredDefaultValue("uid=someDummyValue");
 
-    protected SimpleLdapTemplate ldapTemplate;
+    protected LdapTemplate ldapTemplate;
 
     protected ContextSource contextSource;
 
@@ -90,8 +92,12 @@ public abstract class AbstractLDAPTest e
         contextSource.setBase(baseDN);
         contextSource.setUserDn("uid=admin,ou=system");
         contextSource.setPassword("secret");
+        contextSource.setPooled(false);
         contextSource.afterPropertiesSet();
-        ldapTemplate = new SimpleLdapTemplate(contextSource);
+        PoolingContextSource pcs = new MutablePoolingContextSource();
+        pcs.setContextSource(contextSource);
+        
+        ldapTemplate = new LdapTemplate(pcs);
 
         if (!ldapService.isRunning()) return;
         

Modified: portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/security-ldap.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/security-ldap.xml?rev=929928&r1=929927&r2=929928&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/security-ldap.xml (original)
+++ portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/security-ldap.xml Thu Apr  1 11:19:12 2010
@@ -278,7 +278,7 @@
     <meta key="j2:cat" value="ldapSecurity" />
     <constructor-arg ref="UserDaoConfiguration"/>
     <property name="ldapTemplate">
-      <bean class="org.springframework.ldap.core.simple.SimpleLdapTemplate">
+      <bean class="org.springframework.ldap.core.LdapTemplate">
         <constructor-arg ref="LdapSpringContext" />
       </bean>
     </property>
@@ -330,7 +330,7 @@
     <meta key="j2:cat" value="ldapSecurity" />
     <constructor-arg ref="RoleDaoConfiguration"/>
     <property name="ldapTemplate">
-      <bean class="org.springframework.ldap.core.simple.SimpleLdapTemplate">
+      <bean class="org.springframework.ldap.core.LdapTemplate">
         <constructor-arg ref="LdapSpringContext" />
       </bean>
     </property>
@@ -340,7 +340,7 @@
     <meta key="j2:cat" value="ldapSecurity" />
     <constructor-arg ref="GroupDaoConfiguration"/>
     <property name="ldapTemplate">
-      <bean class="org.springframework.ldap.core.simple.SimpleLdapTemplate">
+      <bean class="org.springframework.ldap.core.LdapTemplate">
         <constructor-arg ref="LdapSpringContext" />
       </bean>
     </property>
@@ -357,7 +357,7 @@
     </property>
   </bean>
 
-  <bean id="LdapSpringContext" class="org.springframework.ldap.pool.factory.PoolingContextSource">
+  <bean id="LdapSpringContext" class="org.springframework.ldap.pool.factory.MutablePoolingContextSource">
     <meta key="j2:cat" value="ldapSecurity" />
     <property name="contextSource">
       <bean class="org.springframework.ldap.core.support.LdapContextSource">



---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org