Return-Path: Delivered-To: apmail-directory-commits-archive@www.apache.org Received: (qmail 92012 invoked from network); 28 Nov 2007 20:53:28 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 28 Nov 2007 20:53:28 -0000 Received: (qmail 29707 invoked by uid 500); 28 Nov 2007 20:53:16 -0000 Delivered-To: apmail-directory-commits-archive@directory.apache.org Received: (qmail 29672 invoked by uid 500); 28 Nov 2007 20:53:16 -0000 Mailing-List: contact commits-help@directory.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@directory.apache.org Delivered-To: mailing list commits@directory.apache.org Received: (qmail 29661 invoked by uid 99); 28 Nov 2007 20:53:16 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 28 Nov 2007 12:53:16 -0800 X-ASF-Spam-Status: No, hits=-100.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 28 Nov 2007 20:53:04 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 41C981A9838; Wed, 28 Nov 2007 12:53:06 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r599142 - in /directory/apacheds/branches/bigbang: bootstrap-plugin/ core-constants/src/main/java/org/apache/directory/server/constants/ core-unit/src/main/java/org/apache/directory/server/core/unit/ core-unit/src/test/java/org/apache/direc... Date: Wed, 28 Nov 2007 20:52:59 -0000 To: commits@directory.apache.org From: akarasulu@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20071128205306.41C981A9838@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: akarasulu Date: Wed Nov 28 12:52:57 2007 New Revision: 599142 URL: http://svn.apache.org/viewvc?rev=599142&view=rev Log: Changes made to changelog feature: o Moved revert() into DirectoryService from ChangeLog o ChangeLog non-null by default yet the service is off o Interceptor included by default yet disabled o Implemented add and delete revert() capabilities o Added some tests to revert adds and deletes o Started working on AbstractTestCase to revert if changelog is enabled o Fixed serious interceptor issue with replication and mitosis based tombstoning of deleted entries o Fixed some issues with pom files and dependencies around constants in the core. Added: directory/apacheds/branches/bigbang/core-unit/src/test/java/org/apache/directory/server/core/changelog/ directory/apacheds/branches/bigbang/core-unit/src/test/java/org/apache/directory/server/core/changelog/DefaultChangeLogITest.java Modified: directory/apacheds/branches/bigbang/bootstrap-plugin/pom.xml directory/apacheds/branches/bigbang/core-constants/src/main/java/org/apache/directory/server/constants/ApacheSchemaConstants.java directory/apacheds/branches/bigbang/core-unit/src/main/java/org/apache/directory/server/core/unit/AbstractTestCase.java directory/apacheds/branches/bigbang/core/pom.xml directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DirectoryService.java directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLog.java directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogInterceptor.java directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/DefaultChangeLog.java directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/MemoryChangeLogStore.java directory/apacheds/branches/bigbang/core/src/test/java/org/apache/directory/server/core/authz/support/MaxImmSubFilterTest.java directory/apacheds/branches/bigbang/core/src/test/java/org/apache/directory/server/core/interceptor/InterceptorChainTest.java directory/apacheds/branches/bigbang/jdbm-store/pom.xml directory/apacheds/branches/bigbang/schema-bootstrap/pom.xml directory/apacheds/branches/bigbang/utils/pom.xml Modified: directory/apacheds/branches/bigbang/bootstrap-plugin/pom.xml URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/bootstrap-plugin/pom.xml?rev=599142&r1=599141&r2=599142&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/bootstrap-plugin/pom.xml (original) +++ directory/apacheds/branches/bigbang/bootstrap-plugin/pom.xml Wed Nov 28 12:52:57 2007 @@ -59,7 +59,7 @@ org.apache.directory.server - apacheds-constants + apacheds-core-constants ${pom.version} Modified: directory/apacheds/branches/bigbang/core-constants/src/main/java/org/apache/directory/server/constants/ApacheSchemaConstants.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-constants/src/main/java/org/apache/directory/server/constants/ApacheSchemaConstants.java?rev=599142&r1=599141&r2=599142&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/core-constants/src/main/java/org/apache/directory/server/constants/ApacheSchemaConstants.java (original) +++ directory/apacheds/branches/bigbang/core-constants/src/main/java/org/apache/directory/server/constants/ApacheSchemaConstants.java Wed Nov 28 12:52:57 2007 @@ -112,8 +112,11 @@ // ApacheNdn String APACHE_ALIAS_AT = "apacheAlias"; String APACHE_ALIAS_OID = "1.3.6.1.4.1.18060.0.4.1.2.7"; - - + + // entryDeleted + String ENTRY_DELETED_AT = "entryDeleted"; + String ENTRY_DELETED_OID = "1.3.6.1.4.1.18060.0.4.1.2.31"; + // SchemaModifiersName String SCHEMA_MODIFIERS_NAME_AT = "schemaModifiersName"; String SCHEMA_MODIFIERS_NAME_AT_OID = ""; Modified: directory/apacheds/branches/bigbang/core-unit/src/main/java/org/apache/directory/server/core/unit/AbstractTestCase.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-unit/src/main/java/org/apache/directory/server/core/unit/AbstractTestCase.java?rev=599142&r1=599141&r2=599142&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/core-unit/src/main/java/org/apache/directory/server/core/unit/AbstractTestCase.java (original) +++ directory/apacheds/branches/bigbang/core-unit/src/main/java/org/apache/directory/server/core/unit/AbstractTestCase.java Wed Nov 28 12:52:57 2007 @@ -24,6 +24,7 @@ import org.apache.commons.io.FileUtils; import org.apache.directory.server.core.DefaultDirectoryService; import org.apache.directory.server.core.DirectoryService; +import org.apache.directory.server.core.changelog.Tag; import org.apache.directory.server.schema.registries.Registries; import org.apache.directory.shared.ldap.ldif.Entry; import org.apache.directory.shared.ldap.ldif.LdifReader; @@ -98,6 +99,13 @@ private Hashtable overrides = new Hashtable(); + /** + * The revision at which a test was begun and the revision we will revert + * to if the change log is enabled by the user. If the change log is + * disabled this is field is ignored and will remain null. + */ + private Tag startTag; + protected Registries registries; protected DirectoryService service; @@ -151,6 +159,22 @@ protected void setUp() throws Exception { super.setUp(); + + // ------------------------------------------------------------------- + // Bypass normal startup if changelog has been enabled and the server + // has already started. + // ------------------------------------------------------------------- + + /// still working on it!!! +// if ( service.getChangeLog().isEnabled() ) +// { +// startTag = service.getChangeLog().tag(); +// +// if ( service.isStarted() ) +// { +// return; +// } +// } // ------------------------------------------------------------------- // Add a single test entry Added: directory/apacheds/branches/bigbang/core-unit/src/test/java/org/apache/directory/server/core/changelog/DefaultChangeLogITest.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-unit/src/test/java/org/apache/directory/server/core/changelog/DefaultChangeLogITest.java?rev=599142&view=auto ============================================================================== --- directory/apacheds/branches/bigbang/core-unit/src/test/java/org/apache/directory/server/core/changelog/DefaultChangeLogITest.java (added) +++ directory/apacheds/branches/bigbang/core-unit/src/test/java/org/apache/directory/server/core/changelog/DefaultChangeLogITest.java Wed Nov 28 12:52:57 2007 @@ -0,0 +1,134 @@ +/* + * 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.core.changelog; + + +import org.apache.directory.server.core.unit.AbstractTestCase; +import org.apache.directory.shared.ldap.exception.LdapNameNotFoundException; +import org.apache.directory.shared.ldap.message.AttributesImpl; + +import javax.naming.NamingException; +import javax.naming.directory.DirContext; + + +/** + * Used to test the default change log implementation with an in memory + * change log store. Note that this will probably be removed since this + * functionality will be used and tested anyway in all other test cases. + * + * @author Apache Directory Project + * @version $Rev$, $Date$ + */ +public class DefaultChangeLogITest extends AbstractTestCase +{ + /** + * Can go away once we remove the need for authentication in super class. + * + * @see DIRSERVER-1105 + */ + public DefaultChangeLogITest() + { + super( "uid=admin,ou=system", "secret" ); + } + + + public void setUp() throws Exception + { + service.getChangeLog().setEnabled( true ); + super.setUp(); + } + + + public void testRevertAddOperations() throws NamingException + { + Tag t0 = service.getChangeLog().tag(); + AttributesImpl attrs = new AttributesImpl( "objectClass", "organizationalUnit", true ); + attrs.put( "ou", "test" ); + sysRoot.createSubcontext( "ou=test", attrs ); + + assertNotNull( sysRoot.getAttributes( "ou=test" ) ); + service.revert( t0.getRevision() ); + + try + { + sysRoot.getAttributes( "ou=test" ); + fail( "Should not be able to find the entry!" ); + } + catch ( NamingException ne ) + { + assertTrue( ne instanceof LdapNameNotFoundException ); + } + } + + + public void testRevertAddAndDeleteOperations() throws NamingException + { + Tag t0 = service.getChangeLog().tag(); + + // add new test entry + AttributesImpl attrs = new AttributesImpl( "objectClass", "organizationalUnit", true ); + attrs.put( "ou", "test" ); + sysRoot.createSubcontext( "ou=test", attrs ); + + // assert presence + assertNotNull( sysRoot.getAttributes( "ou=test" ) ); + + // delete the test entry and test that it is gone + sysRoot.destroySubcontext( "ou=test" ); + assertNotPresent( sysRoot, "ou=test" ); + + // now revert back to begining the added entry is still gone + service.revert( t0.getRevision() ); + assertNotPresent( sysRoot, "ou=test" ); + } + + + public void testRevertDeleteOperations() throws NamingException + { + AttributesImpl attrs = new AttributesImpl( "objectClass", "organizationalUnit", true ); + attrs.put( "ou", "test" ); + sysRoot.createSubcontext( "ou=test", attrs ); + + // tag after the addition before deletion + Tag t0 = service.getChangeLog().tag(); + assertNotNull( sysRoot.getAttributes( "ou=test" ) ); + + // delete the test entry and test that it is gone + sysRoot.destroySubcontext( "ou=test" ); + assertNotPresent( sysRoot, "ou=test" ); + + // now revert and assert that the added entry re-appears + service.revert( t0.getRevision() ); + assertNotNull( sysRoot.getAttributes( "ou=test" ) ); + } + + + private void assertNotPresent( DirContext ctx, String dn ) throws NamingException + { + try + { + ctx.getAttributes( dn ); + fail( "Should not be able to find the entry " + dn + " but it is still there." ); + } + catch ( NamingException ne ) + { + assertTrue( ne instanceof LdapNameNotFoundException ); + } + } +} Modified: directory/apacheds/branches/bigbang/core/pom.xml URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/pom.xml?rev=599142&r1=599141&r2=599142&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/core/pom.xml (original) +++ directory/apacheds/branches/bigbang/core/pom.xml Wed Nov 28 12:52:57 2007 @@ -60,19 +60,19 @@ org.apache.directory.server - apacheds-utils + apacheds-core-constants ${pom.version} org.apache.directory.server - apacheds-jdbm-store + apacheds-utils ${pom.version} org.apache.directory.server - apacheds-constants + apacheds-jdbm-store ${pom.version} Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java?rev=599142&r1=599141&r2=599142&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java (original) +++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java Wed Nov 28 12:52:57 2007 @@ -25,8 +25,11 @@ import org.apache.directory.server.core.authz.AciAuthorizationInterceptor; import org.apache.directory.server.core.authz.DefaultAuthorizationInterceptor; import org.apache.directory.server.core.changelog.ChangeLog; +import org.apache.directory.server.core.changelog.ChangeLogEvent; +import org.apache.directory.server.core.changelog.ChangeLogInterceptor; import org.apache.directory.server.core.changelog.DefaultChangeLog; import org.apache.directory.server.core.collective.CollectiveAttributeInterceptor; +import org.apache.directory.server.core.cursor.Cursor; import org.apache.directory.server.core.event.EventInterceptor; import org.apache.directory.server.core.exception.ExceptionInterceptor; import org.apache.directory.server.core.interceptor.Interceptor; @@ -58,6 +61,7 @@ import org.apache.directory.server.schema.registries.DefaultRegistries; import org.apache.directory.server.schema.registries.OidRegistry; import org.apache.directory.server.schema.registries.Registries; +import org.apache.directory.shared.ldap.NotImplementedException; import org.apache.directory.shared.ldap.constants.AuthenticationLevel; import org.apache.directory.shared.ldap.constants.SchemaConstants; import org.apache.directory.shared.ldap.constants.ServerDNConstants; @@ -65,6 +69,7 @@ import org.apache.directory.shared.ldap.exception.LdapConfigurationException; import org.apache.directory.shared.ldap.exception.LdapNamingException; import org.apache.directory.shared.ldap.exception.LdapNoPermissionException; +import org.apache.directory.shared.ldap.ldif.ChangeType; import org.apache.directory.shared.ldap.ldif.Entry; import org.apache.directory.shared.ldap.message.AttributeImpl; import org.apache.directory.shared.ldap.message.AttributesImpl; @@ -115,6 +120,12 @@ /** the change log service */ private ChangeLog changeLog; + /** remove me after implementation is completed */ + private static final String PARTIAL_IMPL_WARNING = + "WARNING: the changelog is only partially operational and will revert\n" + + "state without consideration of who made the original change. All reverting " + + "changes are made by the admin user.\n Furthermore the used controls are not at " + + "all taken into account"; // ------------------------------------------------------------------------ // Constructor @@ -474,6 +485,7 @@ list.add( new AciAuthorizationInterceptor() ); list.add( new DefaultAuthorizationInterceptor() ); list.add( new ExceptionInterceptor() ); + list.add( new ChangeLogInterceptor() ); list.add( new OperationalAttributeInterceptor() ); list.add( new SchemaInterceptor() ); list.add( new SubentryInterceptor() ); @@ -548,6 +560,70 @@ environment.put( DirectoryService.JNDI_KEY, this ); return new ServerLdapContext( this, environment ); + } + + + public long revert( long revision ) throws NamingException + { + if ( changeLog == null || ! changeLog.isEnabled() ) + { + throw new IllegalStateException( "The change log must be enabled to revert to previous log revisions." ); + } + + if ( revision < 0 ) + { + throw new IllegalArgumentException( "revision must be greater than or equal to 0" ); + } + + if ( revision >= changeLog.getChangeLogStore().getCurrentRevision() ) + { + throw new IllegalArgumentException( "revision must be less than the current revision" ); + } + + DirContext ctx = getJndiContext( new LdapPrincipal( new LdapDN( "uid=admin,ou=system" ), + AuthenticationLevel.SIMPLE ) ); + Cursor cursor = changeLog.getChangeLogStore().findAfter( revision ); + + /* + * BAD, BAD, BAD!!! + * + * No synchronization no nothing. Just getting this to work for now + * so we can revert tests. Any production grade use of this feature + * needs to synchronize on all changes while the revert is in progress. + * + * How about making this operation transactional? + */ + + try + { + LOG.warn( PARTIAL_IMPL_WARNING ); + cursor.afterLast(); + while ( cursor.previous() ) // apply ldifs in reverse order + { + ChangeLogEvent event = cursor.get(); + Entry reverse = event.getReverseLdif(); + + switch( reverse.getChangeType().getChangeType() ) + { + case( ChangeType.ADD_ORDINAL ): + ctx.createSubcontext( reverse.getDn(), reverse.getAttributes() ); + break; + case( ChangeType.DELETE_ORDINAL ): + ctx.destroySubcontext( reverse.getDn() ); + break; + default: + throw new NotImplementedException( "Reverts of change type " + reverse.getChangeType() + + " has not yet been implemented!"); + } + } + } + catch ( IOException e ) + { + throw new NamingException( "Encountered a failure while trying to revert to a previous revision: " + + revision ); + } + + return changeLog.getCurrentRevision(); } Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DirectoryService.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DirectoryService.java?rev=599142&r1=599141&r2=599142&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DirectoryService.java (original) +++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DirectoryService.java Wed Nov 28 12:52:57 2007 @@ -51,19 +51,44 @@ { String JNDI_KEY = DirectoryService.class.getName(); + /** + * Reverts the server's state to an earlier revision. Note that the revsion number + * still increases to revert back even though the state reverted to is the same. + * Note that implementations may lock the server from making changes or searching + * the directory until this operation has completed. + * + * @param revision the revision number to revert to + * @return the new revision reached by applying all changes needed to revert to the + * original state + * @throws NamingException if there are problems reverting back to the earlier state + * @throws IllegalArgumentException if the revision provided is greater than the current + * revision or less than 0 + * @throws UnsupportedOperationException if this feature is not supported by the + * change log + */ + long revert( long revision ) throws NamingException; + + PartitionNexus getPartitionNexus(); + InterceptorChain getInterceptorChain(); + void addPartition( Partition partition ) throws NamingException; + void removePartition( Partition partition ) throws NamingException; + Registries getRegistries(); + void setRegistries( Registries registries ); + SchemaManager getSchemaManager(); + void setSchemaManager( SchemaManager schemaManager ); Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLog.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLog.java?rev=599142&r1=599141&r2=599142&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLog.java (original) +++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLog.java Wed Nov 28 12:52:57 2007 @@ -44,6 +44,15 @@ boolean isEnabled(); + void setEnabled( boolean enabled ); + + + ChangeLogStore getChangeLogStore(); + + + void setChangeLogStore( ChangeLogStore store ); + + /** * Gets the current revision for the server. * @@ -161,22 +170,4 @@ * @throws NamingException if there is a problem taking a tag */ Tag tag() throws NamingException; - - - /** - * Reverts the server's state to an earlier revision. Note that the revsion number - * still increases to revert back even though the state reverted to is the same. - * Note that implementations may lock the server from making changes or searching - * the directory until this operation has completed. - * - * @param revision the revision number to revert to - * @return the new revision reached by applying all changes needed to revert to the - * original state - * @throws NamingException if there are problems reverting back to the earlier state - * @throws IllegalArgumentException if the revision provided is greater than the current - * revision or less than 0 - * @throws UnsupportedOperationException if this feature is not supported by the - * change log - */ - long revert( long revision ) throws NamingException; } Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogInterceptor.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogInterceptor.java?rev=599142&r1=599141&r2=599142&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogInterceptor.java (original) +++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogInterceptor.java Wed Nov 28 12:52:57 2007 @@ -19,6 +19,7 @@ package org.apache.directory.server.core.changelog; +import org.apache.directory.server.constants.ApacheSchemaConstants; import org.apache.directory.server.core.DirectoryService; import org.apache.directory.server.core.interceptor.BaseInterceptor; import org.apache.directory.server.core.interceptor.NextInterceptor; @@ -31,6 +32,10 @@ import org.apache.directory.shared.ldap.ldif.LdifUtils; import org.apache.directory.shared.ldap.message.ModificationItemImpl; import org.apache.directory.shared.ldap.name.Rdn; +import org.apache.directory.shared.ldap.schema.AttributeType; +import org.apache.directory.shared.ldap.util.AttributeUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.naming.NamingEnumeration; import javax.naming.NamingException; @@ -44,6 +49,10 @@ */ public class ChangeLogInterceptor extends BaseInterceptor { + /** for debugging */ + private static final Logger LOG = LoggerFactory.getLogger( ChangeLogInterceptor.class ); + /** used to ignore modify operations to tombstone entries */ + private AttributeType entryDeleted; /** the changelog service to log changes to */ private ChangeLog changeLog; @@ -57,6 +66,9 @@ { super.init( directoryService ); changeLog = directoryService.getChangeLog(); + + entryDeleted = directoryService.getRegistries().getAttributeTypeRegistry() + .lookup( ApacheSchemaConstants.ENTRY_DELETED_OID ); } @@ -92,6 +104,18 @@ */ public void delete( NextInterceptor next, DeleteOperationContext opContext ) throws NamingException { + // @todo make sure we're not putting in operational attributes that cannot be user modified + // must save the entry if change log is enabled + Attributes attributes = null; + + if ( changeLog.isEnabled() ) + { + Invocation invocation = InvocationStack.getInstance().peek(); + PartitionNexusProxy proxy = invocation.getProxy(); + attributes = proxy.lookup( new LookupOperationContext( opContext.getDn() ), + PartitionNexusProxy.LOOKUP_BYPASS ); + } + next.delete( opContext ); if ( ! changeLog.isEnabled() ) @@ -99,12 +123,6 @@ return; } - // @todo make sure we're not putting in operational attributes that cannot be user modified - Invocation invocation = InvocationStack.getInstance().peek(); - PartitionNexusProxy proxy = invocation.getProxy(); - Attributes attributes = proxy.lookup( new LookupOperationContext( opContext.getDn() ), - PartitionNexusProxy.LOOKUP_BYPASS ); - Entry forward = new Entry(); forward.setChangeType( ChangeType.Delete ); forward.setDn( opContext.getDn().getUpName() ); @@ -116,6 +134,14 @@ public void modify( NextInterceptor next, ModifyOperationContext opContext ) throws NamingException { next.modify( opContext ); + + // @TODO: needs big consideration!!! + // NOTE: perhaps we need to log this as a system operation that cannot and should not be reapplied? + if ( AttributeUtils.getAttribute( opContext.getModItems(), entryDeleted ) != null ) + { + LOG.debug( "Bypassing changelog on modify of entryDeleted attribute." ); + return; + } if ( ! changeLog.isEnabled() ) { Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/DefaultChangeLog.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/DefaultChangeLog.java?rev=599142&r1=599141&r2=599142&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/DefaultChangeLog.java (original) +++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/DefaultChangeLog.java Wed Nov 28 12:52:57 2007 @@ -19,9 +19,8 @@ package org.apache.directory.server.core.changelog; -import org.apache.directory.shared.ldap.NotImplementedException; -import org.apache.directory.shared.ldap.ldif.Entry; import org.apache.directory.server.core.authn.LdapPrincipal; +import org.apache.directory.shared.ldap.ldif.Entry; import javax.naming.NamingException; @@ -29,13 +28,15 @@ /** * The default ChangeLog service implementation. * + * @org.apache.xbean.XBean + * * @author Apache Directory Project * @version $Rev$, $Date$ */ public class DefaultChangeLog implements ChangeLog { private boolean enabled; - private ChangeLogStore store; + private ChangeLogStore store = new MemoryChangeLogStore(); public ChangeLogStore getChangeLogStore() @@ -116,7 +117,7 @@ throw new IllegalArgumentException( "revision must be greater than or equal to 0" ); } - if ( revision <= store.getCurrentRevision() ) + if ( revision > store.getCurrentRevision() ) { throw new IllegalArgumentException( "revision must be less than or equal to the current revision" ); } @@ -145,22 +146,6 @@ public Tag tag() throws NamingException { return tag( store.getCurrentRevision(), null ); - } - - - public long revert( long revision ) throws NamingException - { - if ( revision < 0 ) - { - throw new IllegalArgumentException( "revision must be greater than or equal to 0" ); - } - - if ( revision >= store.getCurrentRevision() ) - { - throw new IllegalArgumentException( "revision must be less than the current revision" ); - } - - throw new NotImplementedException(); } Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/MemoryChangeLogStore.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/MemoryChangeLogStore.java?rev=599142&r1=599141&r2=599142&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/MemoryChangeLogStore.java (original) +++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/MemoryChangeLogStore.java Wed Nov 28 12:52:57 2007 @@ -34,6 +34,8 @@ /** * A change log store that keeps it's information in memory. * + * @org.apache.xbean.XBean + * * @author Apache Directory Project * @version $Rev$, $Date$ */ @@ -46,7 +48,12 @@ public Tag tag( long revision ) throws NamingException { - return tags.get( revision ); + if ( tags.containsKey( revision ) ) + { + return tags.get( revision ); + } + + return new Tag( revision, null ); } @@ -110,7 +117,7 @@ public Cursor findAfter( long revision ) throws NamingException { - return new ListCursor( ( int ) ( revision + 1 ), events ); + return new ListCursor( ( int ) revision, events ); } Modified: directory/apacheds/branches/bigbang/core/src/test/java/org/apache/directory/server/core/authz/support/MaxImmSubFilterTest.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/test/java/org/apache/directory/server/core/authz/support/MaxImmSubFilterTest.java?rev=599142&r1=599141&r2=599142&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/core/src/test/java/org/apache/directory/server/core/authz/support/MaxImmSubFilterTest.java (original) +++ directory/apacheds/branches/bigbang/core/src/test/java/org/apache/directory/server/core/authz/support/MaxImmSubFilterTest.java Wed Nov 28 12:52:57 2007 @@ -193,6 +193,12 @@ } + public long revert( long revision ) throws NamingException + { + return 0; + } + + public PartitionNexus getPartitionNexus() { return null; Modified: directory/apacheds/branches/bigbang/core/src/test/java/org/apache/directory/server/core/interceptor/InterceptorChainTest.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/test/java/org/apache/directory/server/core/interceptor/InterceptorChainTest.java?rev=599142&r1=599141&r2=599142&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/core/src/test/java/org/apache/directory/server/core/interceptor/InterceptorChainTest.java (original) +++ directory/apacheds/branches/bigbang/core/src/test/java/org/apache/directory/server/core/interceptor/InterceptorChainTest.java Wed Nov 28 12:52:57 2007 @@ -256,6 +256,12 @@ } + public long revert( long revision ) throws NamingException + { + return 0; + } + + public PartitionNexus getPartitionNexus() { return null; Modified: directory/apacheds/branches/bigbang/jdbm-store/pom.xml URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/jdbm-store/pom.xml?rev=599142&r1=599141&r2=599142&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/jdbm-store/pom.xml (original) +++ directory/apacheds/branches/bigbang/jdbm-store/pom.xml Wed Nov 28 12:52:57 2007 @@ -51,7 +51,7 @@ ${pom.groupId} - apacheds-constants + apacheds-core-constants ${pom.version} Modified: directory/apacheds/branches/bigbang/schema-bootstrap/pom.xml URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/schema-bootstrap/pom.xml?rev=599142&r1=599141&r2=599142&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/schema-bootstrap/pom.xml (original) +++ directory/apacheds/branches/bigbang/schema-bootstrap/pom.xml Wed Nov 28 12:52:57 2007 @@ -48,7 +48,7 @@ org.apache.directory.server - apacheds-constants + apacheds-core-constants ${pom.version} Modified: directory/apacheds/branches/bigbang/utils/pom.xml URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/utils/pom.xml?rev=599142&r1=599141&r2=599142&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/utils/pom.xml (original) +++ directory/apacheds/branches/bigbang/utils/pom.xml Wed Nov 28 12:52:57 2007 @@ -34,7 +34,7 @@ ${pom.groupId} - apacheds-constants + apacheds-core-constants ${pom.version}