You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2005/10/25 08:02:13 UTC
svn commit: r328266 -
/directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/enumeration/SearchResultFilteringEnumeration.java
Author: akarasulu
Date: Mon Oct 24 23:02:10 2005
New Revision: 328266
URL: http://svn.apache.org/viewcvs?rev=328266&view=rev
Log:
changes ...
o added ability to invoke naming manager to populate the object in a
SearchResult using the object factories in the env of the context
o each prefetched entry has its object generated for it if a valid
object factory exists
o this fixes DIREVE-279 here: http://issues.apache.org/jira/browse/DIREVE-279
Modified:
directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/enumeration/SearchResultFilteringEnumeration.java
Modified: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/enumeration/SearchResultFilteringEnumeration.java
URL: http://svn.apache.org/viewcvs/directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/enumeration/SearchResultFilteringEnumeration.java?rev=328266&r1=328265&r2=328266&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/enumeration/SearchResultFilteringEnumeration.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/enumeration/SearchResultFilteringEnumeration.java Mon Oct 24 23:02:10 2005
@@ -20,16 +20,24 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.Hashtable;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.Context;
+import javax.naming.Name;
+import javax.naming.spi.DirectoryManager;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.DirContext;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
import org.apache.ldap.server.invocation.Invocation;
+import org.apache.ldap.common.name.LdapName;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
@@ -42,8 +50,9 @@
*/
public class SearchResultFilteringEnumeration implements NamingEnumeration
{
-// private static final Logger log = LoggerFactory.getLogger( SearchResultFilteringEnumeration.class );
-//
+ /** the logger used by this class */
+ private static final Logger log = LoggerFactory.getLogger( SearchResultFilteringEnumeration.class );
+
/** the list of filters to be applied */
private final List filters;
/** the underlying decorated enumeration */
@@ -57,6 +66,8 @@
private final SearchControls searchControls;
/** the Invocation that representing the search creating this enumeration */
private final Invocation invocation;
+ /** whether or not the caller context has object factories which need to be applied to the results */
+ private final boolean applyObjectFactories;
// ------------------------------------------------------------------------
@@ -84,6 +95,7 @@
this.filters = new ArrayList();
this.filters.add( filter );
this.decorated = decorated;
+ this.applyObjectFactories = invocation.getCaller().getEnvironment().containsKey( Context.OBJECT_FACTORIES );
if ( ! decorated.hasMore() )
{
@@ -115,6 +127,7 @@
this.filters = new ArrayList();
this.filters.addAll( filters );
this.decorated = decorated;
+ this.applyObjectFactories = invocation.getCaller().getEnvironment().containsKey( Context.OBJECT_FACTORIES );
if ( ! decorated.hasMore() )
{
@@ -228,6 +241,34 @@
// ------------------------------------------------------------------------
+ private void applyObjectFactories( SearchResult result ) throws NamingException
+ {
+ // if already populated or no factories are available just return
+ if ( result.getObject() != null || ! applyObjectFactories )
+ {
+ return;
+ }
+
+ DirContext ctx = ( DirContext ) invocation.getCaller();
+ Hashtable env = ctx.getEnvironment();
+ Attributes attrs = result.getAttributes();
+ Name name = new LdapName( result.getName() );
+ try
+ {
+ Object obj = DirectoryManager.getObjectInstance( null, name, ctx, env, attrs );
+ result.setObject( obj );
+ }
+ catch ( Exception e )
+ {
+ StringBuffer buf = new StringBuffer();
+ buf.append( "ObjectFactories threw exception while attempting to generate an object for " );
+ buf.append( result.getName() );
+ buf.append( ". Call on SearchResult.getObject() will return null." );
+ log.warn( buf.toString(), e );
+ }
+ }
+
+
/**
* Keeps getting results from the underlying decorated filter and applying
* the filters until a result is accepted by all and set as the prefetced
@@ -252,6 +293,7 @@
if ( filters.isEmpty() )
{
this.prefetched = tmp;
+ applyObjectFactories( this.prefetched );
return;
}
else if ( filters.size() == 1 )
@@ -261,6 +303,7 @@
if ( accepted )
{
this.prefetched = tmp;
+ applyObjectFactories( this.prefetched );
return;
}
@@ -285,6 +328,7 @@
* on the following call to the next() or nextElement() methods
*/
this.prefetched = tmp;
+ applyObjectFactories( this.prefetched );
return;
}