Modified: directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/ReferralAwareRequestHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/ReferralAwareRequestHandler.java?rev=702434&r1=702433&r2=702434&view=diff
==============================================================================
--- directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/ReferralAwareRequestHandler.java (original)
+++ directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/ReferralAwareRequestHandler.java Tue Oct 7 04:26:55 2008
@@ -24,6 +24,7 @@
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
+import org.apache.directory.server.core.ReferralManager;
import org.apache.directory.server.core.entry.ClonedServerEntry;
import org.apache.directory.server.core.entry.ServerAttribute;
import org.apache.directory.server.ldap.LdapSession;
@@ -32,13 +33,7 @@
import org.apache.directory.shared.ldap.entry.EntryAttribute;
import org.apache.directory.shared.ldap.entry.Value;
import org.apache.directory.shared.ldap.exception.LdapException;
-import org.apache.directory.shared.ldap.message.AddRequest;
-import org.apache.directory.shared.ldap.message.BindRequest;
-import org.apache.directory.shared.ldap.message.CompareRequest;
-import org.apache.directory.shared.ldap.message.DeleteRequest;
import org.apache.directory.shared.ldap.message.LdapResult;
-import org.apache.directory.shared.ldap.message.ModifyDnRequest;
-import org.apache.directory.shared.ldap.message.ModifyRequest;
import org.apache.directory.shared.ldap.message.Referral;
import org.apache.directory.shared.ldap.message.ReferralImpl;
import org.apache.directory.shared.ldap.message.ResultCodeEnum;
@@ -79,76 +74,36 @@
{
LOG.debug( "Handling single reply request: {}", req );
- LdapDN reqTargetDn = null;
-
- switch ( req.getType() )
- {
- case ADD_REQUEST:
- reqTargetDn = ( ( AddRequest ) req ).getEntryDn();
- break;
- case BIND_REQUEST:
- // not used for bind but may be in future
- reqTargetDn = ( ( BindRequest ) req ).getName();
- break;
- case COMPARE_REQUEST:
- reqTargetDn = ( ( CompareRequest ) req ).getName();
- break;
- case DEL_REQUEST:
- reqTargetDn = ( ( DeleteRequest ) req ).getName();
- break;
- case EXTENDED_REQ:
- throw new IllegalStateException(
- "Although ExtendedRequests are SingleReplyRequests they're not handled" +
- " using this base class. They have no target entry unlike the rest of" +
- " the SingleReplyRequests" );
- case MOD_DN_REQUEST:
- /*
- * Special handling needed because of the new superior entry
- * as specified in RFC 3296 section 5.6.2 here:
- *
- * http://www.faqs.org/rfcs/rfc3296.html
- */
- if ( req.getControls().containsKey( ManageDsaITControl.CONTROL_OID ) )
- {
- LOG.debug( "ManageDsaITControl detected." );
- handleIgnoringReferrals( session, ( ( ModifyDnRequest ) req ).getName(), null, req );
- }
- else
- {
- LOG.debug( "ManageDsaITControl NOT detected." );
-
- if ( ( ( ModifyDnRequest ) req ).getNewSuperior() == null )
- {
- handleWithReferrals( session, ( ( ModifyDnRequest ) req ).getName(), req );
- }
- else
- {
- // NOTE: call is to overload just for the ModifyDnRequest
- handleModifyDnWithReferrals( session, req );
- }
- }
- return;
- case MODIFY_REQUEST:
- reqTargetDn = ( ( ModifyRequest ) req ).getName();
- break;
- case SEARCH_REQUEST:
- reqTargetDn = ( ( SearchRequest ) req ).getBase();
- break;
- default:
- throw new IllegalStateException(
- "Unidentified single reply request/response type: " + req );
- }
-
+ // First, if we have the ManageDSAIt control, go directly
+ // to the handling without pre-processing the request
if ( req.getControls().containsKey( ManageDsaITControl.CONTROL_OID ) )
{
LOG.debug( "ManageDsaITControl detected." );
- handleIgnoringReferrals( session, reqTargetDn, null, req );
+ handleIgnoringReferrals( session, req );
}
else
{
LOG.debug( "ManageDsaITControl NOT detected." );
- handleWithReferrals( session, reqTargetDn, req );
+
+ switch ( req.getType() )
+ {
+ case SEARCH_REQUEST:
+ handleWithReferrals( session, ( ( SearchRequest ) req ).getBase(), req );
+ break;
+
+ case EXTENDED_REQ:
+ throw new IllegalStateException(
+ "Although ExtendedRequests are SingleReplyRequests they're not handled" +
+ " using this base class. They have no target entry unlike the rest of" +
+ " the SingleReplyRequests" );
+
+ default:
+ throw new IllegalStateException(
+ "Unidentified single reply request/response type: " + req );
+ }
+
}
+
}
@@ -220,182 +175,51 @@
}
- private void handleModifyDnWithReferrals( LdapSession session, T modifyDnRequest )
+ /**
+ * Handles processing with referrals without ManageDsaIT control.
+ */
+ private void handleWithReferrals( LdapSession session, LdapDN reqTargetDn, T req ) throws NamingException
{
- ModifyDnRequest req = ( ModifyDnRequest ) modifyDnRequest;
LdapResult result = req.getResultResponse().getLdapResult();
ClonedServerEntry entry = null;
- ClonedServerEntry superiorEntry = null;
-
- // -------------------------------------------------------------------
- // Lookup Entry
- // -------------------------------------------------------------------
-
- // try to lookup the entry but ignore exceptions when it does not
- // exist since entry may not exist but may have an ancestor that is a
- // referral - would rather attempt a lookup that fails then do check
- // for existence than have to do another lookup to get entry info
-
- try
- {
- entry = session.getCoreSession().lookup( req.getName() );
- LOG.debug( "Entry for {} was found: ", req.getName(), entry );
- }
- catch ( NameNotFoundException e )
- {
- /* ignore */
- LOG.debug( "Entry for {} not found.", req.getName() );
- }
- catch ( Exception e )
- {
- /* serious and needs handling */
- handleException( session, modifyDnRequest, e );
- return;
- }
+ boolean isReferral = false;
+ boolean isparentReferral = false;
+ ReferralManager referralManager= session.getCoreSession().getDirectoryService().getReferralManager();
- try
- {
- superiorEntry = session.getCoreSession().lookup( req.getNewSuperior() );
- LOG.debug( "New superior entry for {} was found: ", req.getName(), entry );
- }
- catch ( NameNotFoundException e )
- {
- /* ignore */
- LOG.debug( "New superior entry for {} not found.", req.getName() );
- }
- catch ( Exception e )
- {
- /* serious and needs handling */
- handleException( session, modifyDnRequest, e );
- return;
- }
+ reqTargetDn.normalize( session.getCoreSession().getDirectoryService().getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
+
+ // Check if the entry itself is a referral
+ referralManager.lockRead();
- // -------------------------------------------------------------------
- // Handle Existing Entry
- // -------------------------------------------------------------------
+ isReferral = referralManager.isReferral( reqTargetDn );
- if ( entry != null )
+ if ( !isReferral )
{
- try
- {
- if ( isEntryReferral( entry ) )
- {
- LOG.debug( "Entry is a referral: {}", entry );
- handleReferralEntry( session, req.getName(), modifyDnRequest, entry );
- return;
- }
- else
- {
- if ( superiorEntry != null && isEntryReferral( superiorEntry ) )
- {
- result.setErrorMessage( "Superior entry is a referral." );
- result.setMatchedDn( req.getNewSuperior() );
- result.setResultCode( ResultCodeEnum.AFFECTS_MULTIPLE_DSAS );
- session.getIoSession().write( req.getResultResponse() );
- return;
- }
- else if ( superiorEntry == null )
- {
- ClonedServerEntry referralAncestor = getFarthestReferralAncestor( session,
- req.getNewSuperior() );
-
- if ( referralAncestor != null )
- {
- result.setErrorMessage( "Superior entry does has referral ancestor." );
- result.setResultCode( ResultCodeEnum.AFFECTS_MULTIPLE_DSAS );
- session.getIoSession().write( req.getResultResponse() );
- return;
- }
- else
- {
- result.setErrorMessage( "Superior entry does not exist." );
- result.setResultCode( ResultCodeEnum.NO_SUCH_OBJECT );
- session.getIoSession().write( req.getResultResponse() );
- return;
- }
- }
-
- LOG.debug( "Entry is NOT a referral: {}", entry );
- handleIgnoringReferrals( session, req.getName(), entry, modifyDnRequest );
- return;
- }
- }
- catch ( Exception e )
- {
- handleException( session, modifyDnRequest, e );
- }
+ // Check if the entry has a parent which is a referral
+ isparentReferral = referralManager.hasParentReferral( reqTargetDn );
}
-
- // -------------------------------------------------------------------
- // Handle Non-existing Entry
- // -------------------------------------------------------------------
- // if the entry is null we still have to check for a referral ancestor
- // also the referrals need to be adjusted based on the ancestor's ref
- // values to yield the correct path to the entry in the target DSAs
+ referralManager.unlock();
- if ( entry == null )
+ if ( !isReferral && !isparentReferral )
{
- ClonedServerEntry referralAncestor = null;
-
- try
- {
- referralAncestor = getFarthestReferralAncestor( session, req.getName() );
- }
- catch ( Exception e )
- {
- handleException( session, modifyDnRequest, e );
- return;
- }
-
- if ( referralAncestor == null && ! ( req instanceof AddRequest ) )
- {
- result.setErrorMessage( "Entry not found." );
- result.setResultCode( ResultCodeEnum.NO_SUCH_OBJECT );
- session.getIoSession().write( req.getResultResponse() );
- return;
- }
- else if ( ( req instanceof AddRequest ) && referralAncestor == null )
- {
- handleIgnoringReferrals( session, req.getName(), entry, modifyDnRequest );
- return;
- }
-
- // if we get here then we have a valid referral ancestor
- try
- {
- Referral referral = getReferralOnAncestor( session, req.getName(), modifyDnRequest, referralAncestor );
- result.setResultCode( ResultCodeEnum.REFERRAL );
- result.setReferral( referral );
- session.getIoSession().write( req.getResultResponse() );
- }
- catch ( Exception e )
- {
- handleException( session, modifyDnRequest, e );
- }
+ // This is not a referral and it does not have a parent which
+ // is a referral : standard case, just deal with the request
+ LOG.debug( "Entry {} is NOT a referral.", reqTargetDn );
+ handleIgnoringReferrals( session, req );
+ return;
}
- }
-
-
- /**
- * Handles processing with referrals without ManageDsaIT control.
- */
- private void handleWithReferrals( LdapSession session, LdapDN reqTargetDn, T req )
- {
- LdapResult result = req.getResultResponse().getLdapResult();
- ClonedServerEntry entry = null;
-
- // -------------------------------------------------------------------
- // Lookup Entry
- // -------------------------------------------------------------------
-
- // try to lookup the entry but ignore exceptions when it does not
- // exist since entry may not exist but may have an ancestor that is a
- // referral - would rather attempt a lookup that fails then do check
- // for existence than have to do another lookup to get entry info
-
- if ( ! ( req instanceof AddRequest ) )
+ else
{
+ // -------------------------------------------------------------------
+ // Lookup Entry
+ // -------------------------------------------------------------------
+
+ // try to lookup the entry but ignore exceptions when it does not
+ // exist since entry may not exist but may have an ancestor that is a
+ // referral - would rather attempt a lookup that fails then do check
+ // for existence than have to do another lookup to get entry info
+
try
{
entry = session.getCoreSession().lookup( reqTargetDn );
@@ -412,99 +236,94 @@
handleException( session, req, e );
return;
}
- }
-
- // -------------------------------------------------------------------
- // Handle Existing Entry
- // -------------------------------------------------------------------
-
- if ( entry != null )
- {
- try
+
+ // -------------------------------------------------------------------
+ // Handle Existing Entry
+ // -------------------------------------------------------------------
+
+ if ( entry != null )
{
- if ( isEntryReferral( entry ) )
+ try
{
- LOG.debug( "Entry is a referral: {}", entry );
-
- if ( req instanceof SearchRequest )
+ if ( isEntryReferral( entry ) )
{
- handleReferralEntryForSearch( session, ( SearchRequest ) req, entry );
+ LOG.debug( "Entry is a referral: {}", entry );
+
+ if ( req instanceof SearchRequest )
+ {
+ handleReferralEntryForSearch( session, ( SearchRequest ) req, entry );
+ }
+ else
+ {
+ handleReferralEntry( session, reqTargetDn, req, entry );
+ }
+ return;
}
else
{
- handleReferralEntry( session, reqTargetDn, req, entry );
+ LOG.debug( "Entry is NOT a referral: {}", entry );
+ handleIgnoringReferrals( session, req );
+ return;
}
- return;
}
- else
+ catch ( Exception e )
{
- LOG.debug( "Entry is NOT a referral: {}", entry );
- handleIgnoringReferrals( session, reqTargetDn, entry, req );
- return;
+ handleException( session, req, e );
}
}
- catch ( Exception e )
- {
- handleException( session, req, e );
- }
- }
-
- // -------------------------------------------------------------------
- // Handle Non-existing Entry
- // -------------------------------------------------------------------
-
- // if the entry is null we still have to check for a referral ancestor
- // also the referrals need to be adjusted based on the ancestor's ref
- // values to yield the correct path to the entry in the target DSAs
-
- if ( entry == null )
- {
- ClonedServerEntry referralAncestor = null;
-
- try
- {
- referralAncestor = getFarthestReferralAncestor( session, reqTargetDn );
- }
- catch ( Exception e )
- {
- handleException( session, req, e );
- return;
- }
-
- if ( referralAncestor == null && ! ( req instanceof AddRequest ) )
- {
- result.setErrorMessage( "Entry not found." );
- result.setResultCode( ResultCodeEnum.NO_SUCH_OBJECT );
- session.getIoSession().write( req.getResultResponse() );
- return;
- }
- else if ( ( req instanceof AddRequest ) && referralAncestor == null )
- {
- handleIgnoringReferrals( session, reqTargetDn, entry, req );
- return;
- }
-
- // if we get here then we have a valid referral ancestor
- try
+
+ // -------------------------------------------------------------------
+ // Handle Non-existing Entry
+ // -------------------------------------------------------------------
+
+ // if the entry is null we still have to check for a referral ancestor
+ // also the referrals need to be adjusted based on the ancestor's ref
+ // values to yield the correct path to the entry in the target DSAs
+
+ if ( entry == null )
{
- Referral referral = null;
-
- if ( req instanceof SearchRequest )
+ ClonedServerEntry referralAncestor = null;
+
+ try
{
- referral = getReferralOnAncestorForSearch( session, ( SearchRequest ) req, referralAncestor );
+ referralAncestor = getFarthestReferralAncestor( session, reqTargetDn );
}
- else
+ catch ( Exception e )
{
- referral = getReferralOnAncestor( session, reqTargetDn, req, referralAncestor );
+ handleException( session, req, e );
+ return;
+ }
+
+ if ( referralAncestor == null )
+ {
+ result.setErrorMessage( "Entry not found." );
+ result.setResultCode( ResultCodeEnum.NO_SUCH_OBJECT );
+ session.getIoSession().write( req.getResultResponse() );
+ return;
+ }
+
+ // if we get here then we have a valid referral ancestor
+ try
+ {
+ Referral referral = null;
+
+ if ( req instanceof SearchRequest )
+ {
+ referral = getReferralOnAncestorForSearch( session, ( SearchRequest ) req, referralAncestor );
+ }
+ else
+ {
+ referral = getReferralOnAncestor( session, reqTargetDn, req, referralAncestor );
+ }
+
+ result.setResultCode( ResultCodeEnum.REFERRAL );
+ result.setReferral( referral );
+ session.getIoSession().write( req.getResultResponse() );
+ }
+ catch ( Exception e )
+ {
+ handleException( session, req, e );
}
-
- result.setResultCode( ResultCodeEnum.REFERRAL );
- result.setReferral( referral );
- session.getIoSession().write( req.getResultResponse() );
- }
- catch ( Exception e )
- {
- handleException( session, req, e );
}
}
}
@@ -777,7 +596,7 @@
/**
* Handles processing with referrals without ManageDsaIT control.
*/
- public void handleException( LdapSession session, T req, Exception e )
+ public void handleException( LdapSession session, ResultResponseRequest req, Exception e )
{
LdapResult result = req.getResultResponse().getLdapResult();
@@ -848,6 +667,5 @@
* exist.
* @param req the request to be handled
*/
- public abstract void handleIgnoringReferrals( LdapSession session, LdapDN reqTargetDn,
- ClonedServerEntry entry, T req );
+ public abstract void handleIgnoringReferrals( LdapSession session, T req );
}
Modified: directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java?rev=702434&r1=702433&r2=702434&view=diff
==============================================================================
--- directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java (original)
+++ directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java Tue Oct 7 04:26:55 2008
@@ -564,8 +564,7 @@
* @param session the associated session
* @param req the received SearchRequest
*/
- public void handleIgnoringReferrals( LdapSession session, LdapDN reqTargetDn,
- ClonedServerEntry entry, SearchRequest req )
+ public void handleIgnoringReferrals( LdapSession session, SearchRequest req )
{
if ( IS_DEBUG )
{
Added: directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/controls/PagedSearchCookie.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/controls/PagedSearchCookie.java?rev=702434&view=auto
==============================================================================
--- directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/controls/PagedSearchCookie.java (added)
+++ directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/controls/PagedSearchCookie.java Tue Oct 7 04:26:55 2008
@@ -0,0 +1,126 @@
+/*
+ * 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.directory.server.ldap.handlers.controls;
+
+import java.nio.BufferUnderflowException;
+import java.nio.ByteBuffer;
+
+/**
+ *
+ * A container for the Page search cookie. We store multiple informations :
+ * -
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class PagedSearchCookie
+{
+ /** The total number of entries already returned */
+ private int cumulativeSize;
+
+ /** The original MessageId */
+ private int messageId;
+ /**
+ *
+ * Creates a new instance of PagedSearchCookie.
+ *
+ */
+ public PagedSearchCookie()
+ {
+ cumulativeSize = 0;
+ messageId = -1;
+ }
+
+
+ /**
+ *
+ * Creates a new instance of PagedSearchCookie,
+ * deserializing the cookie.
+ *
+ * @throws BufferUnderflowException if the buffer is not large enough to
+ * contain correct values
+ *
+ */
+ public PagedSearchCookie( byte[] cookie ) throws BufferUnderflowException
+ {
+ ByteBuffer bb = ByteBuffer.allocate( cookie.length );
+ bb.put( cookie );
+
+ cumulativeSize = bb.getInt();
+ messageId = bb.getInt();
+ }
+
+
+ /**
+ * @return The current number of entries returned since the first request
+ */
+ public int getCumulativeSize()
+ {
+ return cumulativeSize;
+ }
+
+
+ /**
+ * Increment the cumulativeSize field with the number of
+ * entries returned with the last request
+ *
+ * @param size
+ */
+ public void incrementCumulativeSize()
+ {
+ cumulativeSize ++;
+ }
+
+
+ /**
+ * @return The cookie associated messageId
+ */
+ public int getMessageId()
+ {
+ return messageId;
+ }
+
+
+ /**
+ * Assign the message ID to this cookie
+ *
+ * @param messageId The request message ID
+ */
+ public void setMessageId( int messageId )
+ {
+ this.messageId = messageId;
+ }
+
+
+ /**
+ * Serialize the cookie
+ *
+ * @return A byte array containing the data returned to the client
+ */
+ public byte[] serialize()
+ {
+ ByteBuffer bb = ByteBuffer.allocate( 12 );
+
+ bb.putInt( cumulativeSize );
+ bb.putInt( messageId );
+
+ return bb.array();
+ }
+}
Modified: directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/extended/LaunchDiagnosticUiHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/extended/LaunchDiagnosticUiHandler.java?rev=702434&r1=702433&r2=702434&view=diff
==============================================================================
--- directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/extended/LaunchDiagnosticUiHandler.java (original)
+++ directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/extended/LaunchDiagnosticUiHandler.java Tue Oct 7 04:26:55 2008
@@ -25,7 +25,6 @@
import java.awt.Toolkit;
import java.util.Collections;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.Set;
import javax.swing.JFrame;
@@ -95,12 +94,12 @@
adminDn.normalize( service.getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
LdapPrincipal principal = new LdapPrincipal( adminDn, AuthenticationLevel.STRONG );
CoreSession session = service.getSession( principal );
- Iterator<String> list = nexus.listSuffixes( new ListSuffixOperationContext( session ) );
+ Set<String> suffixes = nexus.listSuffixes( new ListSuffixOperationContext( session ) );
int launchedWindowCount = 0;
- while ( list.hasNext() )
+ for ( String suffix:suffixes )
{
- LdapDN dn = new LdapDN( list.next() );
+ LdapDN dn = new LdapDN( suffix );
Partition partition = nexus.getPartition( dn );
if ( partition instanceof BTreePartition )
Modified: directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/add/AddIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/add/AddIT.java?rev=702434&r1=702433&r2=702434&view=diff
==============================================================================
--- directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/add/AddIT.java (original)
+++ directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/add/AddIT.java Tue Oct 7 04:26:55 2008
@@ -20,8 +20,10 @@
package org.apache.directory.server.operations.add;
+import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
+import javax.naming.PartialResultException;
import javax.naming.ReferralException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
@@ -45,18 +47,26 @@
import netscape.ldap.LDAPResponseListener;
import netscape.ldap.LDAPSearchConstraints;
+import org.apache.directory.server.constants.ServerDNConstants;
+import org.apache.directory.server.core.CoreSession;
+import org.apache.directory.server.core.DirectoryService;
+import org.apache.directory.server.core.authn.LdapPrincipal;
import org.apache.directory.server.core.integ.Level;
import org.apache.directory.server.core.integ.annotations.ApplyLdifs;
import org.apache.directory.server.core.integ.annotations.CleanupLevel;
+import org.apache.directory.server.core.jndi.ServerLdapContext;
import org.apache.directory.server.integ.SiRunner;
+
import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredConnection;
import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredContext;
import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredContextThrowOnRefferal;
import org.apache.directory.server.ldap.LdapService;
+import org.apache.directory.shared.ldap.constants.AuthenticationLevel;
import org.apache.directory.shared.ldap.constants.SchemaConstants;
import org.apache.directory.shared.ldap.message.ResultCodeEnum;
+import org.apache.directory.shared.ldap.name.LdapDN;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
@@ -85,6 +95,7 @@
"cn: The Person\n" +
"description: this is a person\n" +
"sn: Person\n\n" +
+
// Entry # 1
"dn: uid=akarasulu,ou=users,ou=system\n" +
"objectClass: uidObject\n" +
@@ -93,6 +104,7 @@
"uid: akarasulu\n" +
"cn: Alex Karasulu\n" +
"sn: karasulu\n\n" +
+
// Entry # 2
"dn: ou=Computers,uid=akarasulu,ou=users,ou=system\n" +
"objectClass: organizationalUnit\n" +
@@ -100,6 +112,7 @@
"ou: computers\n" +
"description: Computers for Alex\n" +
"seeAlso: ou=Machines,uid=akarasulu,ou=users,ou=system\n\n" +
+
// Entry # 3
"dn: uid=akarasuluref,ou=users,ou=system\n" +
"objectClass: uidObject\n" +
@@ -564,16 +577,83 @@
attrSet.add( new LDAPAttribute( "ou", "UnderReferral" ) );
LDAPEntry entry = new LDAPEntry( "ou=UnderReferral,uid=akarasuluref,ou=users,ou=system", attrSet );
- conn.add( entry, constraints );
+ try
+ {
+ conn.add( entry, constraints );
+ fail();
+ }
+ catch ( LDAPException le )
+ {
+ assertEquals( 80, le.getLDAPResultCode() );
+ }
- LDAPEntry reread = conn.read( "ou=UnderReferral,uid=akarasuluref,ou=users,ou=system",
- ( LDAPSearchConstraints ) constraints );
- assertEquals( "ou=UnderReferral,uid=akarasuluref,ou=users,ou=system", reread.getDN() );
+ try
+ {
+ conn.read( "ou=UnderReferral,uid=akarasuluref,ou=users,ou=system",
+ ( LDAPSearchConstraints ) constraints );
+ fail();
+ }
+ catch ( LDAPException le )
+ {
+
+ }
conn.disconnect();
}
+ public static LdapContext getContext( String principalDn, DirectoryService service, String dn )
+ throws Exception
+ {
+ if ( principalDn == null )
+ {
+ principalDn = "";
+ }
+
+ LdapDN userDn = new LdapDN( principalDn );
+ userDn.normalize( service.getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
+ LdapPrincipal principal = new LdapPrincipal( userDn, AuthenticationLevel.SIMPLE );
+
+ if ( dn == null )
+ {
+ dn = "";
+ }
+
+ CoreSession session = service.getSession( principal );
+ LdapContext ctx = new ServerLdapContext( service, session, new LdapDN( dn ) );
+ return ctx;
+ }
+
+
+ /**
+ * Tests add operation on referral entry with the ManageDsaIT control.
+ */
+ @Test
+ public void testOnReferralWitJNDIIgnore() throws Exception
+ {
+ LdapContext MNNCtx = getContext( ServerDNConstants.ADMIN_SYSTEM_DN, ldapService.getDirectoryService(), "uid=akarasuluref,ou=users,ou=system" );
+
+ // Set to 'ignore'
+ MNNCtx.addToEnvironment( Context.REFERRAL, "ignore" );
+
+ try
+ {
+ // JNDI entry
+ Attributes userEntry = new BasicAttributes( "objectClass", "top", true );
+ userEntry.get( "objectClass" ).add( "person" );
+ userEntry.put( "sn", "elecharny" );
+ userEntry.put( "cn", "Emmanuel Lecharny" );
+
+ MNNCtx.createSubcontext( "cn=Emmanuel Lecharny, ou=apache, ou=people", userEntry );
+ fail();
+ }
+ catch ( PartialResultException pre )
+ {
+ assertTrue( true );
+ }
+ }
+
+
/**
* Tests referral handling when an ancestor is a referral.
*/
Modified: directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/delete/DeleteIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/delete/DeleteIT.java?rev=702434&r1=702433&r2=702434&view=diff
==============================================================================
--- directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/delete/DeleteIT.java (original)
+++ directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/delete/DeleteIT.java Tue Oct 7 04:26:55 2008
@@ -67,6 +67,7 @@
"uid: akarasulu\n" +
"cn: Alex Karasulu\n" +
"sn: karasulu\n\n" +
+
// Entry # 2
"dn: ou=Computers,uid=akarasulu,ou=users,ou=system\n" +
"objectClass: organizationalUnit\n" +
@@ -74,6 +75,7 @@
"ou: computers\n" +
"description: Computers for Alex\n" +
"seeAlso: ou=Machines,uid=akarasulu,ou=users,ou=system\n\n" +
+
// Entry # 3
"dn: uid=akarasuluref,ou=users,ou=system\n" +
"objectClass: uidObject\n" +
Modified: directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/modifydn/ModifyDnReferralIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/modifydn/ModifyDnReferralIT.java?rev=702434&r1=702433&r2=702434&view=diff
==============================================================================
--- directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/modifydn/ModifyDnReferralIT.java (original)
+++ directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/modifydn/ModifyDnReferralIT.java Tue Oct 7 04:26:55 2008
@@ -67,6 +67,7 @@
"uid: akarasulu\n" +
"cn: Alex Karasulu\n" +
"sn: karasulu\n\n" +
+
// Entry # 2
"dn: ou=Computers,uid=akarasulu,ou=users,ou=system\n" +
"objectClass: organizationalUnit\n" +
@@ -74,6 +75,7 @@
"ou: computers\n" +
"description: Computers for Alex\n" +
"seeAlso: ou=Machines,uid=akarasulu,ou=users,ou=system\n\n" +
+
// Entry # 3
"dn: uid=akarasuluref,ou=users,ou=system\n" +
"objectClass: uidObject\n" +
@@ -83,6 +85,7 @@
"ref: ldap://localhost:10389/uid=akarasulu,ou=users,ou=system\n" +
"ref: ldap://foo:10389/uid=akarasulu,ou=users,ou=system\n" +
"ref: ldap://bar:10389/uid=akarasulu,ou=users,ou=system\n\n" +
+
// Entry # 4
"dn: uid=elecharny,ou=users,ou=system\n" +
"objectClass: uidObject\n" +
@@ -136,12 +139,15 @@
conn.setConstraints( constraints );
// ModifyDN success
- conn.rename( "uid=elecharny,ou=users,ou=system", "uid=newuser",
- "uid=akarasuluref,ou=users,ou=system", true, constraints );
- LDAPEntry entry = conn.read( "uid=newuser,uid=akarasuluref,ou=users,ou=system",
- ( LDAPSearchConstraints ) constraints );
- assertNotNull( entry );
- assertEquals( "uid=newuser,uid=akarasuluref,ou=users,ou=system", entry.getDN() );
+ try
+ {
+ conn.rename( "uid=elecharny,ou=users,ou=system", "uid=newuser",
+ "uid=akarasuluref,ou=users,ou=system", true, constraints );
+ }
+ catch ( LDAPException le )
+ {
+ assertEquals ( LDAPException.AFFECTS_MULTIPLE_DSAS, le.getLDAPResultCode() );
+ }
conn.disconnect();
}
Modified: directory/installers/trunk/apacheds-noarch/pom.xml
URL: http://svn.apache.org/viewvc/directory/installers/trunk/apacheds-noarch/pom.xml?rev=702434&r1=702433&r2=702434&view=diff
==============================================================================
--- directory/installers/trunk/apacheds-noarch/pom.xml (original)
+++ directory/installers/trunk/apacheds-noarch/pom.xml Tue Oct 7 04:26:55 2008
@@ -43,78 +43,6 @@
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- <configuration>
- <shadedArtifactAttached>true</shadedArtifactAttached>
- <shadedClassifierName>app</shadedClassifierName>
- <artifactSet>
- <excludes>
- <!-- this should not be needed and is not needed when building just the installers
- it does seem to be needed when building *-with-dependencies -->
- <exclude>bouncycastle:bcprov-jdk15</exclude>
- </excludes>
- </artifactSet>
- <!-- Uncomment the filters below and remove the dependency on shared-bouncycastle-reduced
- if you want to try to shrink the bc repackaging further. I (djencks) got stuck -->
-<!--
- <filters>
- <filter>
- <artifact>bouncycastle:bcprov-jdk15</artifact>
- <includes>
- <include>org/bouncycastle/asn1/**</include>
- <include>org/bouncycastle/jce/provider/BouncyCastleProvider.class</include>
- <include>org/bouncycastle/x509/X509V1CertificateGenerator.class</include>
- <include>org/bouncycastle/jce/interfaces/ConfigurableProvider.class</include>
- <include>org/bouncycastle/jce/provider/symmetric/AESMappings.class</include>
- <include>org/bouncycastle/asn1/nist/NISTObjectIdentifiers.class</include>
- <include>org/bouncycastle/asn1/DERObjectIdentifier.class</include>
- <include>org/bouncycastle/asn1/ASN1Object.class</include>
- <include>org/bouncycastle/asn1/DERObject.class</include>
- <include>org/bouncycastle/asn1/DERTags.class</include>
- <include>org/bouncycastle/asn1/ASN1Encodable.class</include>
- <include>org/bouncycastle/asn1/DEREncodable.class</include>
- <include>org/bouncycastle/jce/provider/symmetric/CamelliaMappings.class</include>
- <include>org/bouncycastle/asn1/ntt/NTTObjectIdentifiers.class</include>
- <include>org/bouncycastle/jce/provider/symmetric/CAST5Mappings.class</include>
- <include>org/bouncycastle/jce/provider/symmetric/SEEDMappings.class</include>
- <include>org/bouncycastle/asn1/kisa/KISAObjectIdentifiers.class</include>
- <include>org/bouncycastle/asn1/pkcs/PKCSObjectIdentifiers.class</include>
- <include>org.bouncycastle.jce.provider.JDKX509CertificateFactory.class</include>
- <include>org.bouncycastle.jce.provider.JDKX509CertificateFactory.class</include>
- </includes>
- <excludes>
- <exclude>META-INF/BCKEY.SF</exclude>
- <exclude>META-INF/BCKEY.DSA</exclude>
- <exclude>org/bouncycastle/crypto/engines/IDEAEngine.class</exclude>
- <exclude>org/bouncycastle/asn1/misc/IDEACBCPar.class</exclude>
- <exclude>org/bouncycastle/jce/provider/JDKAlgorithmParameterGenerator$IDEA.class</exclude>
- <exclude>org/bouncycastle/jce/provider/JCEKeyGenerator$IDEA.class</exclude>
- <exclude>org/bouncycastle/jce/provider/JCEBlockCipher$IDEA.class</exclude>
- <exclude>org/bouncycastle/jce/provider/JCESecretKeyFactory$PBEWithSHAAndIDEA.class</exclude>
- <exclude>org/bouncycastle/jce/provider/JCEBlockCipher$PBEWithSHAAndIDEA.class</exclude>
- <exclude>org/bouncycastle/jce/provider/JDKAlgorithmParameters$IDEAAlgorithmParameters.class</exclude>
- <exclude>org/bouncycastle/jce/provider/JCEStreamCipher$IDEA_OFB8.class</exclude>
- <exclude>org/bouncycastle/jce/provider/JCEMac$IDEACFB8.class</exclude>
- <exclude>org/bouncycastle/jce/provider/JCEBlockCipher$IDEACBC.class</exclude>
- <exclude>org/bouncycastle/jce/provider/JCEMac$IDEA.class</exclude>
- <exclude>org/bouncycastle/jce/provider/JCEStreamCipher$IDEA_CFB8.class</exclude>
- </excludes>
- </filter>
- </filters>
--->
- </configuration>
- </execution>
- </executions>
- </plugin>
-
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<configuration>
Modified: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/entry/client/DefaultClientEntry.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/entry/client/DefaultClientEntry.java?rev=702434&r1=702433&r2=702434&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/entry/client/DefaultClientEntry.java (original)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/entry/client/DefaultClientEntry.java Tue Oct 7 04:26:55 2008
@@ -1102,7 +1102,7 @@
StringBuilder sb = new StringBuilder();
sb.append( "ClientEntry\n" );
- sb.append( " dn: " ).append( dn ).append( '\n' );
+ sb.append( " dn: " ).append( dn.getUpName() ).append( '\n' );
// First dump the ObjectClass attribute
if ( containsAttribute( "objectClass" ) )
Modified: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/LdapURL.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/LdapURL.java?rev=702434&r1=702433&r2=702434&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/LdapURL.java (original)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/LdapURL.java Tue Oct 7 04:26:55 2008
@@ -1351,7 +1351,7 @@
if ( dn != null )
{
- sb.append( '/' ).append( urlEncode( dn.toString(), false ) );
+ sb.append( '/' ).append( urlEncode( dn.getUpName(), false ) );
if ( attributes.size() != 0 || forceScopeRendering
|| ( ( scope != SearchControls.OBJECT_SCOPE ) || ( filter != null ) || ( extensionList.size() != 0 ) ) )
Modified: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/tree/DnBranchNode.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/tree/DnBranchNode.java?rev=702434&r1=702433&r2=702434&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/tree/DnBranchNode.java (original)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/tree/DnBranchNode.java Tue Oct 7 04:26:55 2008
@@ -27,6 +27,7 @@
import javax.naming.NamingException;
import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.name.Rdn;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -34,8 +35,10 @@
/**
*
* The Hierarchical Container holds elements ordered by their DN.
- *
+ * <br/>
* We can see them as directories, where the leaves are the files.
+ * <br/>
+ * This class is *not* thread safe
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
@@ -47,6 +50,8 @@
/** Stores the list of all the descendant */
private Map<String, DnNode<N>> children;
+ /** Stores the number of descendents */
+ private int size;
/**
* Creates a new instance of a DnBranchNode.
@@ -54,6 +59,7 @@
public DnBranchNode()
{
children = new HashMap<String, DnNode<N>>(3);
+ size = 0;
}
@@ -83,7 +89,14 @@
if ( index == dn.size() - 1 )
{
- return current.addNode( rdnAtIndex, new DnLeafNode<N>( element ) );
+ if ( !current.contains( rdnAtIndex ) )
+ {
+ return current.addNode( rdnAtIndex, new DnLeafNode<N>( element ) );
+ }
+ else
+ {
+ return null;
+ }
}
else
{
@@ -102,7 +115,15 @@
}
DnNode<N> child = recursivelyAddElement( (DnBranchNode<N>)newNode, dn, index + 1, element );
- return current.addNode( rdnAtIndex, child );
+
+ if ( child != null )
+ {
+ return current.addNode( rdnAtIndex, child );
+ }
+ else
+ {
+ return null;
+ }
}
}
@@ -117,6 +138,7 @@
public DnNode<N> addNode( String rdn, DnNode<N> child )
{
children.put( rdn, child );
+ size++;
return this;
}
@@ -217,7 +239,7 @@
*/
public boolean hasParentElement( LdapDN dn )
{
- Enumeration<String> rdns = dn.getAll();
+ Enumeration<Rdn> rdns = dn.getAllRdn();
// This is synchronized so that we can't read the
// partitionList when it is modified.
@@ -228,7 +250,7 @@
// Iterate through all the RDN until we find the associated partition
while ( rdns.hasMoreElements() )
{
- String rdn = rdns.nextElement();
+ Rdn rdn = rdns.nextElement();
if ( currentNode == null )
{
@@ -242,9 +264,9 @@
DnBranchNode<N> currentBranch = ( DnBranchNode<N> ) currentNode;
- if ( currentBranch.contains( rdn ) )
+ if ( currentBranch.contains( rdn.getNormName() ) )
{
- currentNode = currentBranch.getChild( rdn );
+ currentNode = currentBranch.getChild( rdn.getNormName() );
if ( currentNode instanceof DnLeafNode )
{
@@ -287,6 +309,7 @@
{
// found ! Remove it from the children
currentNode.children.remove( key );
+ currentNode.size--;
return true;
}
}
@@ -298,8 +321,14 @@
{
// If there are no more children, we can remove the node
currentNode.children.remove( key );
- return true;
+ currentNode.size--;
+ }
+ else
+ {
+ currentNode.size--;
}
+
+ return true;
}
}
}
@@ -336,10 +365,15 @@
{
recursivelyRemoveElement( currentNode, element );
}
- else
- {
-
- }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int size()
+ {
+ return size;
}
Modified: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/tree/DnLeafNode.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/tree/DnLeafNode.java?rev=702434&r1=702433&r2=702434&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/tree/DnLeafNode.java (original)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/tree/DnLeafNode.java Tue Oct 7 04:26:55 2008
@@ -51,6 +51,9 @@
}
+ /**
+ * @return Return the stored element
+ */
public N getElement()
{
return element;
@@ -58,6 +61,15 @@
/**
+ * {@inheritDoc}
+ */
+ public int size()
+ {
+ return 1;
+ }
+
+
+ /**
* @see Object#toString()
*/
public String toString()
Modified: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/tree/DnNode.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/tree/DnNode.java?rev=702434&r1=702433&r2=702434&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/tree/DnNode.java (original)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/tree/DnNode.java Tue Oct 7 04:26:55 2008
@@ -37,4 +37,13 @@
* @return <code>true</code> if the class is a leaf node, false otherwise.
*/
boolean isLeaf();
+
+
+ /**
+ * Returns the number of entries under this node. It includes
+ * the node itself, plus the sum of all it children and descendents.
+ *
+ * @return The number of descendents
+ */
+ int size();
}
Modified: directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/util/tree/TestDnNode.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/util/tree/TestDnNode.java?rev=702434&r1=702433&r2=702434&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/util/tree/TestDnNode.java (original)
+++ directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/util/tree/TestDnNode.java Tue Oct 7 04:26:55 2008
@@ -125,6 +125,22 @@
assertTrue( dnLookupTree.hasParentElement( new LdapDN( "dc=nothing,dc=empty" ) ) );
assertFalse( dnLookupTree.hasParentElement( new LdapDN( "dc=directory,dc=apache,dc=root" ) ) );
}
+
+
+ /**
+ * Test that we can add an entry twice without any problem
+ * TODO testAddEntryTwice.
+ *
+ */
+ @Test
+ public void testAddEntryTwice() throws NamingException
+ {
+ assertEquals( 6, dnLookupTree.size() );
+
+ dnLookupTree.add( dn1, dn1 );
+
+ assertEquals( 6, dnLookupTree.size() );
+ }
/**
* test the deletion of elements in a tree
@@ -133,6 +149,7 @@
public void testComplexTreeDeletion() throws NamingException
{
dnLookupTree.remove( dn3 );
+ assertEquals( 5, dnLookupTree.size() );
assertTrue( dnLookupTree.hasParentElement( dn1 ) );
assertTrue( dnLookupTree.hasParentElement( dn2 ) );
assertTrue( dnLookupTree.hasParentElement( dn4 ) );
@@ -142,6 +159,7 @@
assertFalse( dnLookupTree.hasParentElement( new LdapDN( "dc=directory,dc=apache,dc=root" ) ) );
dnLookupTree.remove( dn6 );
+ assertEquals( 4, dnLookupTree.size() );
assertTrue( dnLookupTree.hasParentElement( dn1 ) );
assertTrue( dnLookupTree.hasParentElement( dn2 ) );
assertTrue( dnLookupTree.hasParentElement( dn4 ) );
@@ -150,6 +168,7 @@
assertFalse( dnLookupTree.hasParentElement( new LdapDN( "dc=directory,dc=apache,dc=root" ) ) );
dnLookupTree.remove( dn1 );
+ assertEquals( 3, dnLookupTree.size() );
assertTrue( dnLookupTree.hasParentElement( dn2 ) );
assertTrue( dnLookupTree.hasParentElement( dn4 ) );
assertTrue( dnLookupTree.hasParentElement( dn5 ) );
@@ -158,6 +177,7 @@
// Should not change anything
dnLookupTree.remove( dn3 );
+ assertEquals( 3, dnLookupTree.size() );
assertTrue( dnLookupTree.hasParentElement( dn2 ) );
assertTrue( dnLookupTree.hasParentElement( dn4 ) );
assertTrue( dnLookupTree.hasParentElement( dn5 ) );
@@ -165,17 +185,20 @@
assertFalse( dnLookupTree.hasParentElement( new LdapDN( "dc=directory,dc=apache,dc=root" ) ) );
dnLookupTree.remove( dn5 );
+ assertEquals( 2, dnLookupTree.size() );
assertTrue( dnLookupTree.hasParentElement( dn2 ) );
assertTrue( dnLookupTree.hasParentElement( dn4 ) );
assertFalse( dnLookupTree.hasParentElement( new LdapDN( "dc=nothing,dc=empty" ) ) );
assertFalse( dnLookupTree.hasParentElement( new LdapDN( "dc=directory,dc=apache,dc=root" ) ) );
dnLookupTree.remove( dn2 );
+ assertEquals( 1, dnLookupTree.size() );
assertTrue( dnLookupTree.hasParentElement( dn4 ) );
assertFalse( dnLookupTree.hasParentElement( new LdapDN( "dc=nothing,dc=empty" ) ) );
assertFalse( dnLookupTree.hasParentElement( new LdapDN( "dc=directory,dc=apache,dc=root" ) ) );
dnLookupTree.remove( dn4 );
+ assertEquals( 0, dnLookupTree.size() );
assertFalse( dnLookupTree.hasParentElement( new LdapDN( "dc=nothing,dc=empty" ) ) );
assertFalse( dnLookupTree.hasParentElement( new LdapDN( "dc=directory,dc=apache,dc=root" ) ) );
}
Modified: directory/shared/trunk/pom.xml
URL: http://svn.apache.org/viewvc/directory/shared/trunk/pom.xml?rev=702434&r1=702433&r2=702434&view=diff
==============================================================================
--- directory/shared/trunk/pom.xml (original)
+++ directory/shared/trunk/pom.xml Tue Oct 7 04:26:55 2008
@@ -55,7 +55,6 @@
<module>ldap-constants</module>
<module>asn1-codec</module>
<module>convert</module>
- <module>bouncycastle-reduced</module>
</modules>
<dependencyManagement>
|