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 2004/11/04 01:53:17 UTC
svn commit: rev 56543 - incubator/directory/eve/trunk/protocol/src/java/org/apache/eve/protocol
Author: akarasulu
Date: Wed Nov 3 16:53:17 2004
New Revision: 56543
Modified:
incubator/directory/eve/trunk/protocol/src/java/org/apache/eve/protocol/AddHandler.java
incubator/directory/eve/trunk/protocol/src/java/org/apache/eve/protocol/BindHandler.java
incubator/directory/eve/trunk/protocol/src/java/org/apache/eve/protocol/SearchHandler.java
Log:
implemented add, bind and search
Modified: incubator/directory/eve/trunk/protocol/src/java/org/apache/eve/protocol/AddHandler.java
==============================================================================
--- incubator/directory/eve/trunk/protocol/src/java/org/apache/eve/protocol/AddHandler.java (original)
+++ incubator/directory/eve/trunk/protocol/src/java/org/apache/eve/protocol/AddHandler.java Wed Nov 3 16:53:17 2004
@@ -19,12 +19,13 @@
import javax.naming.InitialContext;
import javax.naming.NamingException;
+import javax.naming.directory.DirContext;
import org.apache.seda.listener.ClientKey;
import org.apache.seda.protocol.AbstractSingleReplyHandler;
-import org.apache.ldap.common.name.LdapName;
import org.apache.ldap.common.message.*;
+import org.apache.ldap.common.util.ExceptionUtils;
/**
@@ -42,17 +43,28 @@
resp.setLdapResult( new LdapResultImpl( resp ) );
InitialContext ictx = SessionRegistry.getSingleton( null ).get( key );
- LdapName dn;
-
try
{
- dn = new LdapName( req.getName() );
+ DirContext ctx = ( DirContext ) ictx.lookup( "" );
+ ctx.createSubcontext( req.getName(), req.getEntry() );
}
catch ( NamingException e )
{
- //resp.getLdapResult().setResultCode( ResultCodeEnum);
+ String msg = "failed to add entry " + req.getName() + ":\n";
+ msg += ExceptionUtils.getStackTrace( e );
+ ResultCodeEnum code;
+ code = ResultCodeEnum.getBestEstimate( e, req.getType() );
+ resp.getLdapResult().setResultCode( code );
+ resp.getLdapResult().setErrorMessage( msg );
+
+ if ( e.getResolvedName() != null )
+ {
+ resp.getLdapResult().setMatchedDn( e.getResolvedName().toString() );
+ }
}
+ resp.getLdapResult().setResultCode( ResultCodeEnum.SUCCESS );
+ resp.getLdapResult().setMatchedDn( req.getName() );
return resp;
}
}
Modified: incubator/directory/eve/trunk/protocol/src/java/org/apache/eve/protocol/BindHandler.java
==============================================================================
--- incubator/directory/eve/trunk/protocol/src/java/org/apache/eve/protocol/BindHandler.java (original)
+++ incubator/directory/eve/trunk/protocol/src/java/org/apache/eve/protocol/BindHandler.java Wed Nov 3 16:53:17 2004
@@ -73,6 +73,8 @@
}
SessionRegistry.getSingleton( null ).put( key, ictx );
+ resp.getLdapResult().setResultCode( ResultCodeEnum.SUCCESS );
+ resp.getLdapResult().setMatchedDn( req.getName() );
return resp;
}
}
Modified: incubator/directory/eve/trunk/protocol/src/java/org/apache/eve/protocol/SearchHandler.java
==============================================================================
--- incubator/directory/eve/trunk/protocol/src/java/org/apache/eve/protocol/SearchHandler.java (original)
+++ incubator/directory/eve/trunk/protocol/src/java/org/apache/eve/protocol/SearchHandler.java Wed Nov 3 16:53:17 2004
@@ -17,12 +17,22 @@
package org.apache.eve.protocol;
-import java.util.Iterator;
+import java.util.*;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.ldap.LdapContext;
+import javax.naming.directory.SearchResult;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.Attribute;
import org.apache.seda.protocol.AbstractManyReplyHandler;
import org.apache.seda.listener.ClientKey;
-import org.apache.ldap.common.NotImplementedException;
+import org.apache.ldap.common.util.ExceptionUtils;
+import org.apache.ldap.common.util.ArrayUtils;
+import org.apache.ldap.common.message.*;
/**
@@ -33,6 +43,9 @@
*/
public class SearchHandler extends AbstractManyReplyHandler
{
+ private static final String DEREFALIASES_KEY = "java.naming.ldap.derefAliases";
+
+
public SearchHandler()
{
super( true );
@@ -41,6 +54,257 @@
public Iterator handle( ClientKey key, Object request )
{
- throw new NotImplementedException();
+ LdapContext ctx;
+ SearchRequest req = ( SearchRequest ) request;
+ InitialContext ictx = SessionRegistry.getSingleton( null ).get( key );
+ NamingEnumeration list = null;
+
+ // check the attributes to see if a referral's ref attribute is included
+ String[] ids = null;
+ Collection retAttrs = new HashSet();
+ retAttrs.addAll( req.getAttributes() );
+ if ( retAttrs.size() > 0 && ! retAttrs.contains( "ref" ) )
+ {
+ retAttrs.add( "ref" );
+ ids = ( String [] ) retAttrs.toArray( ArrayUtils.EMPTY_STRING_ARRAY );
+ }
+ else if ( retAttrs.size() > 0 )
+ {
+ ids = ( String [] ) retAttrs.toArray( ArrayUtils.EMPTY_STRING_ARRAY );
+ }
+
+ // prepare all the search controls
+ SearchControls controls = new SearchControls();
+ controls.setCountLimit( req.getSizeLimit() );
+ controls.setTimeLimit( req.getTimeLimit() );
+ controls.setSearchScope( req.getScope().getValue() );
+ controls.setReturningObjFlag( req.getTypesOnly() );
+ controls.setReturningAttributes( ids );
+ controls.setDerefLinkFlag( true );
+
+ try
+ {
+ ctx = ( LdapContext ) ictx.lookup( "" );
+ ctx.addToEnvironment( DEREFALIASES_KEY, req.getDerefAliases().getName() );
+ list = ctx.search( req.getBase(), req.getFilter().toString(), controls );
+ }
+ catch ( NamingException e )
+ {
+ String msg = "failed on search operation:\n" + req + "\n";
+ msg += ExceptionUtils.getStackTrace( e );
+ SearchResponseDone resp = new SearchResponseDoneImpl( req.getMessageId() );
+ ResultCodeEnum rc = ResultCodeEnum.getBestEstimate( e, req.getType() );
+ resp.setLdapResult( new LdapResultImpl( resp ) );
+ resp.getLdapResult().setResultCode( rc );
+ resp.getLdapResult().setErrorMessage( msg );
+ if ( e.getResolvedName() != null )
+ {
+ resp.getLdapResult().setMatchedDn( e.getResolvedName().toString() );
+ }
+
+ return Collections.singleton( resp ).iterator();
+ }
+
+ return new SearchResponseIterator( req, list );
+ }
+
+
+ SearchResponseDone getResponse( SearchRequest req, NamingException e )
+ {
+ String msg = "failed on search operation:\n" + req + "\n";
+ msg += ExceptionUtils.getStackTrace( e );
+ SearchResponseDone resp = new SearchResponseDoneImpl( req.getMessageId() );
+ ResultCodeEnum rc = ResultCodeEnum.getBestEstimate( e, req.getType() );
+ resp.setLdapResult( new LdapResultImpl( resp ) );
+ resp.getLdapResult().setResultCode( rc );
+ resp.getLdapResult().setErrorMessage( msg );
+ if ( e.getResolvedName() != null )
+ {
+ resp.getLdapResult().setMatchedDn( e.getResolvedName().toString() );
+ }
+
+ return resp;
+ }
+
+
+ class SearchResponseIterator implements Iterator
+ {
+ private final SearchRequest req;
+ private final NamingEnumeration underlying;
+ private SearchResponseDone respDone;
+ private boolean done = false;
+ private Object prefetched;
+
+
+ /**
+ * Creates a search response iterator for the resulting enumeration
+ * over a search request.
+ *
+ * @param req the search request to generate responses to
+ * @param underlying the underlying JNDI enumeration containing SearchResults
+ */
+ public SearchResponseIterator( SearchRequest req, NamingEnumeration underlying )
+ {
+ this.req = req;
+ this.underlying = underlying;
+
+ try
+ {
+ if ( underlying.hasMore() )
+ {
+ SearchResult result = ( SearchResult ) underlying.next();
+
+ /*
+ * Now we have to build the prefetched object from the 'result'
+ * local variable for the following call to next()
+ */
+ Attribute ref = result.getAttributes().get( "ref" );
+ if ( ref == null && ref.size() > 0 )
+ {
+ SearchResponseEntry respEntry;
+ respEntry = new SearchResponseEntryImpl( req.getMessageId() );
+ respEntry.setAttributes( result.getAttributes() );
+ respEntry.setObjectName( result.getName() );
+ prefetched = respEntry;
+ }
+ else
+ {
+ SearchResponseReference respRef;
+ respRef = new SearchResponseReferenceImpl( req.getMessageId() );
+ respRef.setReferral( new ReferralImpl( respRef ) );
+ for ( int ii = 0; ii < ref.size(); ii++ )
+ {
+ String url;
+
+ try
+ {
+ url = ( String ) ref.get( ii );
+ respRef.getReferral().addLdapUrl( url );
+ }
+ catch ( NamingException e )
+ {
+ try { underlying.close(); } catch( Throwable t ) {}
+ prefetched = null;
+ respDone = getResponse( req, e );
+ }
+ }
+ prefetched = respRef;
+ }
+ }
+ }
+ catch ( NamingException e )
+ {
+ try { this.underlying.close(); } catch( Exception e2 ) {}
+ respDone = getResponse( req, e );
+ }
+ }
+
+
+ public boolean hasNext()
+ {
+ return !done;
+ }
+
+
+ public Object next()
+ {
+ Object next = prefetched;
+ SearchResult result = null;
+
+ // if we're done we got nothing to give back
+ if ( done )
+ {
+ throw new NoSuchElementException();
+ }
+
+ // if respDone has been assembled this is our last object to return
+ if ( respDone != null )
+ {
+ done = true;
+ return respDone;
+ }
+
+ /*
+ * If we have gotten this far then we have a valid next entry
+ * or referral to return from this call in the 'next' variable.
+ */
+ try
+ {
+ /*
+ * If we have more results from the underlying cursorr then
+ * we just set the result and build the response object below.
+ */
+ if ( underlying.hasMore() )
+ {
+ result = ( SearchResult ) underlying.next();
+ }
+ else
+ {
+ try { underlying.close(); } catch( Throwable t ) {}
+ respDone = new SearchResponseDoneImpl( req.getMessageId() );
+ respDone.setLdapResult( new LdapResultImpl( respDone ) );
+ respDone.getLdapResult().setResultCode( ResultCodeEnum.SUCCESS );
+ respDone.getLdapResult().setMatchedDn( req.getBase() );
+ prefetched = null;
+ return next;
+ }
+ }
+ catch ( NamingException e )
+ {
+ try { underlying.close(); } catch( Throwable t ) {}
+ prefetched = null;
+ respDone = getResponse( req, e );
+ return next;
+ }
+
+ /*
+ * Now we have to build the prefetched object from the 'result'
+ * local variable for the following call to next()
+ */
+ Attribute ref = result.getAttributes().get( "ref" );
+ if ( ref == null && ref.size() > 0 )
+ {
+ SearchResponseEntry respEntry = new SearchResponseEntryImpl( req.getMessageId() );
+ respEntry.setAttributes( result.getAttributes() );
+ respEntry.setObjectName( result.getName() );
+ prefetched = respEntry;
+ }
+ else
+ {
+ SearchResponseReference respRef = new SearchResponseReferenceImpl( req.getMessageId() );
+ respRef.setReferral( new ReferralImpl( respRef ) );
+ for ( int ii = 0; ii < ref.size(); ii++ )
+ {
+ String url;
+
+ try
+ {
+ url = ( String ) ref.get( ii );
+ respRef.getReferral().addLdapUrl( url );
+ }
+ catch ( NamingException e )
+ {
+ try { underlying.close(); } catch( Throwable t ) {}
+ prefetched = null;
+ respDone = getResponse( req, e );
+ return next;
+ }
+ }
+ prefetched = respRef;
+ }
+
+ return next;
+ }
+
+
+ /**
+ * Unsupported so it throws an exception.
+ *
+ * @throws UnsupportedOperationException
+ */
+ public void remove()
+ {
+ throw new UnsupportedOperationException();
+ }
}
}