|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
/** |
|
* Given an enumeration of candidates, check whether each |
|
* item in enumeration satifies the given filter. |
|
* Each item is a Binding and the following is used to get its |
|
* attributes for used by the filter: |
|
* |
|
* ((DirContext)item.getObject()).getAttributes(""). |
|
* If item.getObject() is not an DirContext, the item is skipped |
|
* |
|
* The items in the enumeration are obtained one at a time as |
|
* items from the search enumeration are requested. |
|
* |
|
* @author Rosanna Lee |
|
*/ |
|
|
|
package com.sun.jndi.toolkit.dir; |
|
|
|
import javax.naming.*; |
|
import javax.naming.directory.*; |
|
import javax.naming.spi.DirectoryManager; |
|
|
|
import java.util.NoSuchElementException; |
|
import java.util.Hashtable; |
|
|
|
final public class LazySearchEnumerationImpl |
|
implements NamingEnumeration<SearchResult> { |
|
private NamingEnumeration<Binding> candidates; |
|
private SearchResult nextMatch = null; |
|
private SearchControls cons; |
|
private AttrFilter filter; |
|
private Context context; |
|
private Hashtable<String, Object> env; |
|
private boolean useFactory = true; |
|
|
|
public LazySearchEnumerationImpl(NamingEnumeration<Binding> candidates, |
|
AttrFilter filter, SearchControls cons) throws NamingException { |
|
this.candidates = candidates; |
|
this.filter = filter; |
|
|
|
if(cons == null) { |
|
this.cons = new SearchControls(); |
|
} else { |
|
this.cons = cons; |
|
} |
|
} |
|
|
|
@SuppressWarnings("unchecked") |
|
public LazySearchEnumerationImpl(NamingEnumeration<Binding> candidates, |
|
AttrFilter filter, SearchControls cons, |
|
Context ctx, Hashtable<String, Object> env, boolean useFactory) |
|
throws NamingException { |
|
|
|
this.candidates = candidates; |
|
this.filter = filter; |
|
this.env = (Hashtable<String, Object>) |
|
((env == null) ? null : env.clone()); |
|
this.context = ctx; |
|
this.useFactory = useFactory; |
|
|
|
if(cons == null) { |
|
this.cons = new SearchControls(); |
|
} else { |
|
this.cons = cons; |
|
} |
|
} |
|
|
|
|
|
public LazySearchEnumerationImpl(NamingEnumeration<Binding> candidates, |
|
AttrFilter filter, SearchControls cons, |
|
Context ctx, Hashtable<String, Object> env) throws NamingException { |
|
this(candidates, filter, cons, ctx, env, true); |
|
} |
|
|
|
public boolean hasMore() throws NamingException { |
|
|
|
return findNextMatch(false) != null; |
|
} |
|
|
|
public boolean hasMoreElements() { |
|
try { |
|
return hasMore(); |
|
} catch (NamingException e) { |
|
return false; |
|
} |
|
} |
|
|
|
public SearchResult nextElement() { |
|
try { |
|
return findNextMatch(true); |
|
} catch (NamingException e) { |
|
throw new NoSuchElementException(e.toString()); |
|
} |
|
} |
|
|
|
public SearchResult next() throws NamingException { |
|
|
|
return (findNextMatch(true)); |
|
} |
|
|
|
public void close() throws NamingException { |
|
if (candidates != null) { |
|
candidates.close(); |
|
} |
|
} |
|
|
|
private SearchResult findNextMatch(boolean remove) throws NamingException { |
|
SearchResult answer; |
|
if (nextMatch != null) { |
|
answer = nextMatch; |
|
if (remove) { |
|
nextMatch = null; |
|
} |
|
return answer; |
|
} else { |
|
|
|
Binding next; |
|
Object obj; |
|
Attributes targetAttrs; |
|
while (candidates.hasMore()) { |
|
next = candidates.next(); |
|
obj = next.getObject(); |
|
if (obj instanceof DirContext) { |
|
targetAttrs = ((DirContext)(obj)).getAttributes(""); |
|
if (filter.check(targetAttrs)) { |
|
if (!cons.getReturningObjFlag()) { |
|
obj = null; |
|
} else if (useFactory) { |
|
try { |
|
// Give name only if context non-null, |
|
// otherewise, name will be interpreted relative |
|
|
|
Name nm = (context != null ? |
|
new CompositeName(next.getName()) : null); |
|
obj = DirectoryManager.getObjectInstance(obj, |
|
nm, context, env, targetAttrs); |
|
} catch (NamingException e) { |
|
throw e; |
|
} catch (Exception e) { |
|
NamingException e2 = new NamingException( |
|
"problem generating object using object factory"); |
|
e2.setRootCause(e); |
|
throw e2; |
|
} |
|
} |
|
answer = new SearchResult(next.getName(), |
|
next.getClassName(), obj, |
|
SearchFilter.selectAttributes(targetAttrs, |
|
cons.getReturningAttributes()), |
|
true); |
|
if (!remove) |
|
nextMatch = answer; |
|
return answer; |
|
} |
|
} |
|
} |
|
return null; |
|
} |
|
} |
|
} |