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 2007/11/11 00:58:05 UTC
svn commit: r593828 -
/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/
Author: akarasulu
Date: Sat Nov 10 15:58:02 2007
New Revision: 593828
URL: http://svn.apache.org/viewvc?rev=593828&view=rev
Log:
changes to changelog ...
o seems we need some minimal means to at least iterate through log entries
this is needed for the change log service to revert state back to a revision
o moved minimal set of methods from search engine adding them to the store
o started using a Cursor instead of a NamingEnumeration
Added:
directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/DefaultChangeLogService.java
directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/MemoryChangeLogStore.java
directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/MemoryChangeLogStoreTest.java
Modified:
directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogEvent.java
directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogSearchEngine.java
directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogService.java
directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogStore.java
directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/TaggableChangeLogStore.java
Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogEvent.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogEvent.java?rev=593828&r1=593827&r2=593828&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogEvent.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogEvent.java Sat Nov 10 15:58:02 2007
@@ -46,13 +46,10 @@
* Creates a new instance of ChangeLogEvent.
*
* @param revision the revision number for the change
- * @param committer the authorized user which triggered the change
- * @param forwardLdif the LDIF representing the change forward in time
- * @param reverseLdif an LDIF which reverts the change going reverse in time to an earlier revision
* @param zuluTime the timestamp for when the change occurred in generalizedTime format
*/
public ChangeLogEvent( long revision, String zuluTime, LdapPrincipal committer,
- Entry forwardLdif, Entry reverseLdif )
+ Entry forwardLdif, Entry reverseLdif )
{
this.zuluTime = zuluTime;
this.revision = revision;
Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogSearchEngine.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogSearchEngine.java?rev=593828&r1=593827&r2=593828&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogSearchEngine.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogSearchEngine.java Sat Nov 10 15:58:02 2007
@@ -68,8 +68,8 @@
* @throws NamingException if there are failures accessing the store
*/
long lookup( String generalizedTime ) throws NamingException;
-
-
+
+
/**
* Looks up the ChangeLogEvent for a revision.
*
@@ -80,21 +80,25 @@
* and greater than the current revision)
*/
ChangeLogEvent lookup( long revision ) throws NamingException;
-
-
+
+
/**
* Finds all the ChangeLogEvents within the system since revision 0.
- *
+ *
+ * This method should exhibit isolation characteristics: meaning if the request is
+ * initiated at revision 100 then any subsequent log entries increasing the revision
+ * should not be seen.
+ *
* @param order the order in which to return ChangeLogEvents (ordered by revision number)
- * @return an enumeration of all the ChangeLogEvents
+ * @return an enumeration of all the ChangeLogEvents
* @throws NamingException if there are failures accessing the store
*/
NamingEnumeration<ChangeLogEvent> find( RevisionOrder order ) throws NamingException;
-
+
/**
* Finds the ChangeLogEvents that occurred before a revision inclusive.
- *
+ *
* @param revision the revision number to get the ChangeLogEvents before
* @param order the order in which to return ChangeLogEvents (ordered by revision number)
* @return an enumeration of all the ChangeLogEvents before and including some revision
@@ -103,11 +107,15 @@
* and greater than the current revision)
*/
NamingEnumeration<ChangeLogEvent> findBefore( long revision, RevisionOrder order ) throws NamingException;
-
-
+
+
/**
* Finds the ChangeLogEvents that occurred after a revision inclusive.
- *
+ *
+ * This method should exhibit isolation characteristics: meaning if the request is
+ * initiated at revision 100 then any subsequent log entries increasing the revision
+ * should not be seen.
+ *
* @param revision the revision number to get the ChangeLogEvents after
* @param order the order in which to return ChangeLogEvents (ordered by revision number)
* @return an enumeration of all the ChangeLogEvents after and including the revision
@@ -116,11 +124,11 @@
* and greater than the current revision)
*/
NamingEnumeration<ChangeLogEvent> findAfter( long revision, RevisionOrder order ) throws NamingException;
-
-
+
+
/**
* Finds the ChangeLogEvents that occurred between a revision range inclusive.
- *
+ *
* @param startRevision the revision number to start getting the ChangeLogEvents above
* @param endRevision the revision number to start getting the ChangeLogEvents below
* @param order the order in which to return ChangeLogEvents (ordered by revision number)
@@ -129,9 +137,9 @@
* @throws IllegalArgumentException if the start and end revisions are out of range
* (less than 0 and greater than the current revision), or if startRevision > endRevision
*/
- NamingEnumeration<ChangeLogEvent> find( long startRevision, long endRevision, RevisionOrder order )
+ NamingEnumeration<ChangeLogEvent> find( long startRevision, long endRevision, RevisionOrder order )
throws NamingException;
-
+
/**
* Finds all the ChangeLogEvents on an entry.
Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogService.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogService.java?rev=593828&r1=593827&r2=593828&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogService.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogService.java Sat Nov 10 15:58:02 2007
@@ -99,6 +99,30 @@
Tag tag( long revision ) throws NamingException;
/**
+ * Creates a tag for a snapshot of the server in a specific state at a revision.
+ * If the ChangeLog has a TaggableChangeLogStore then the tag is stored. If it
+ * does not then it's up to callers to track this tag since it will not be stored
+ * by this service.
+ *
+ * @param revision the revision to tag the snapshot
+ * @param description some information about what the snapshot tag represents
+ * @return the Tag associated with the revision
+ * @throws NamingException if there is a problem taking a tag
+ * @throws IllegalArgumentException if the revision is out of range (less than 0
+ * and greater than the current revision)
+ */
+ Tag tag( long revision, String description ) throws NamingException;
+
+ /**
+ * Creates a snapshot of the server at the current revision.
+ *
+ * @param description some information about what the snapshot tag represents
+ * @return the revision at which the tag is created
+ * @throws NamingException if there is a problem taking a tag
+ */
+ Tag tag( String description ) throws NamingException;
+
+ /**
* Creates a snapshot of the server at the current revision.
*
* @return the revision at which the tag is created
Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogStore.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogStore.java?rev=593828&r1=593827&r2=593828&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogStore.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/ChangeLogStore.java Sat Nov 10 15:58:02 2007
@@ -20,11 +20,13 @@
package org.apache.directory.server.core.changelog;
-import javax.naming.NamingException;
-
import org.apache.directory.server.core.authn.LdapPrincipal;
+import org.apache.directory.server.core.cursor.Cursor;
import org.apache.directory.shared.ldap.ldif.Entry;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+
/**
* A store for change events on the directory which exposes methods for
@@ -49,8 +51,76 @@
* @param principal the authorized LDAP principal triggering the change
* @param forward LDIF of the change going to the next state
* @param reverse LDIF (anti-operation): the change required to revert this change
- * @return the commit id or revision representing the change within the log
+ * @return the new revision reached after having applied the forward LDIF
* @throws NamingException if there are problems logging the change
*/
long log( LdapPrincipal principal, Entry forward, Entry reverse ) throws NamingException;
+
+
+ /**
+ * Looks up the ChangeLogEvent for a revision.
+ *
+ * @param revision to get a ChangeLogEvent for
+ * @return the ChangeLogEvent associated with the revision
+ * @throws NamingException if there are failures accessing the store
+ * @throws IllegalArgumentException if the revision is out of range (less than 0
+ * and greater than the current revision)
+ */
+ ChangeLogEvent lookup( long revision ) throws NamingException;
+
+
+ /**
+ * Gets a Cursor over all the ChangeLogEvents within the system since
+ * revision 0.
+ *
+ * This method should exhibit isolation characteristics: meaning if the
+ * request is initiated at revision 100, then any subsequent log entries
+ * increasing the revision should not be seen.
+ *
+ * @return a Cursor over all the ChangeLogEvents
+ * @throws NamingException if there are failures accessing the store
+ */
+ Cursor<ChangeLogEvent> find() throws NamingException;
+
+
+ /**
+ * Gets a Cursor over the ChangeLogEvents that occurred before a revision
+ * exclusive.
+ *
+ * @param revision the revision number to get the ChangeLogEvents before
+ * @return a Cursor over the ChangeLogEvents before a revision
+ * @throws NamingException if there are failures accessing the store
+ * @throws IllegalArgumentException if the revision is out of range (less than 0
+ * and greater than the current revision)
+ */
+ Cursor<ChangeLogEvent> findBefore( long revision ) throws NamingException;
+
+
+ /**
+ * Finds the ChangeLogEvents that occurred after a revision exclusive.
+ *
+ * This method should exhibit isolation characteristics: meaning if the request is
+ * initiated at revision 100 then any subsequent log entries increasing the revision
+ * should not be seen.
+ *
+ * @param revision the revision number to get the ChangeLogEvents after
+ * @return a Cursor of all the ChangeLogEvents after and including the revision
+ * @throws NamingException if there are failures accessing the store
+ * @throws IllegalArgumentException if the revision is out of range (less than 0
+ * and greater than the current revision)
+ */
+ Cursor<ChangeLogEvent> findAfter( long revision ) throws NamingException;
+
+
+ /**
+ * Finds the ChangeLogEvents that occurred between a revision range inclusive.
+ *
+ * @param startRevision the revision number to start getting the ChangeLogEvents above
+ * @param endRevision the revision number to start getting the ChangeLogEvents below
+ * @return an enumeration of all the ChangeLogEvents within some revision range inclusive
+ * @throws NamingException if there are failures accessing the store
+ * @throws IllegalArgumentException if the start and end revisions are out of range
+ * (less than 0 and greater than the current revision), or if startRevision > endRevision
+ */
+ Cursor<ChangeLogEvent> find( long startRevision, long endRevision ) throws NamingException;
}
Added: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/DefaultChangeLogService.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/DefaultChangeLogService.java?rev=593828&view=auto
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/DefaultChangeLogService.java (added)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/DefaultChangeLogService.java Sat Nov 10 15:58:02 2007
@@ -0,0 +1,151 @@
+/*
+ * 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.shared.ldap.NotImplementedException;
+
+import javax.naming.NamingException;
+
+
+/**
+ * The default ChangeLog service implementation.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class DefaultChangeLogService implements ChangeLogService
+{
+ private ChangeLogStore store;
+
+
+ public ChangeLogStore getChangeLogStore()
+ {
+ return store;
+ }
+
+
+ public void setChangeLogStore( ChangeLogStore store )
+ {
+ this.store = store;
+ }
+
+
+ public long getCurrentRevision() throws NamingException
+ {
+ return store.getCurrentRevision();
+ }
+
+
+ public boolean isLogSearchSupported()
+ {
+ return store instanceof SearchableChangeLogStore;
+ }
+
+
+ public boolean isTagSearchSupported()
+ {
+ return store instanceof TaggableSearchableChangeLogStore;
+ }
+
+
+ public boolean isTagStorageSupported()
+ {
+ return store instanceof TaggableChangeLogStore;
+ }
+
+
+ public ChangeLogSearchEngine getChangeLogSearchEngine()
+ {
+ if ( isLogSearchSupported() )
+ {
+ return ( ( SearchableChangeLogStore ) store ).getChangeLogSearchEngine();
+ }
+
+ throw new UnsupportedOperationException(
+ "The underlying changelog store does not support searching through it's logs" );
+ }
+
+
+ public TagSearchEngine getTagSearchEngine()
+ {
+ if ( isTagSearchSupported() )
+ {
+ return ( ( TaggableSearchableChangeLogStore ) store ).getTagSearchEngine();
+ }
+
+ throw new UnsupportedOperationException(
+ "The underlying changelog store does not support searching through it's tags" );
+ }
+
+
+ public Tag tag( long revision, String description ) 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 or equal to the current revision" );
+ }
+
+ if ( store instanceof TaggableChangeLogStore )
+ {
+ return ( ( TaggableChangeLogStore ) store ).tag( revision );
+ }
+
+ return new Tag( revision, description );
+ }
+
+
+ public Tag tag( long revision ) throws NamingException
+ {
+ return tag( revision, null );
+ }
+
+
+ public Tag tag( String description ) throws NamingException
+ {
+ return tag( store.getCurrentRevision(), description );
+ }
+
+
+ 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();
+ }
+}
Added: 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=593828&view=auto
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/MemoryChangeLogStore.java (added)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/MemoryChangeLogStore.java Sat Nov 10 15:58:02 2007
@@ -0,0 +1,121 @@
+/*
+ * 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.authn.LdapPrincipal;
+import org.apache.directory.server.core.cursor.Cursor;
+import org.apache.directory.server.core.cursor.ListCursor;
+import org.apache.directory.shared.ldap.ldif.Entry;
+import org.apache.directory.shared.ldap.util.DateUtils;
+
+import javax.naming.NamingException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * A change log store that keeps it's information in memory.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class MemoryChangeLogStore implements TaggableChangeLogStore
+{
+ private long currentRevision;
+ private final Map<Long,Tag> tags = new HashMap<Long,Tag>( 100 );
+ private final List<ChangeLogEvent> events = new ArrayList<ChangeLogEvent>();
+
+
+ public Tag tag( long revision ) throws NamingException
+ {
+ return tags.get( revision );
+ }
+
+
+ public Tag tag() throws NamingException
+ {
+ return new Tag( currentRevision, null );
+ }
+
+
+ public Tag tag( String description ) throws NamingException
+ {
+ Tag tag = new Tag( currentRevision, description );
+ tags.put( currentRevision, tag );
+ return tag;
+ }
+
+
+ public long getCurrentRevision()
+ {
+ return currentRevision;
+ }
+
+
+ public long log( LdapPrincipal principal, Entry forward, Entry reverse ) throws NamingException
+ {
+ currentRevision++;
+ ChangeLogEvent event = new ChangeLogEvent( currentRevision, DateUtils.getGeneralizedTime(),
+ principal, forward, reverse );
+ events.add( event );
+ return currentRevision;
+ }
+
+
+ public ChangeLogEvent lookup( long revision ) throws NamingException
+ {
+ if ( revision < 0 )
+ {
+ throw new IllegalArgumentException( "revision must be greater than or equal to 0" );
+ }
+
+ if ( revision > getCurrentRevision() )
+ {
+ throw new IllegalArgumentException( "The revision must not be greater than the current revision" );
+ }
+
+ return events.get( ( int ) revision );
+ }
+
+
+ public Cursor<ChangeLogEvent> find() throws NamingException
+ {
+ return new ListCursor<ChangeLogEvent>( events );
+ }
+
+
+ public Cursor<ChangeLogEvent> findBefore( long revision ) throws NamingException
+ {
+ return new ListCursor<ChangeLogEvent>( events, ( int ) revision );
+ }
+
+
+ public Cursor<ChangeLogEvent> findAfter( long revision ) throws NamingException
+ {
+ return new ListCursor<ChangeLogEvent>( ( int ) ( revision + 1 ), events );
+ }
+
+
+ public Cursor<ChangeLogEvent> find( long startRevision, long endRevision ) throws NamingException
+ {
+ return new ListCursor<ChangeLogEvent>( ( int ) startRevision, events, ( int ) ( endRevision + 1 ) );
+ }
+}
Added: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/MemoryChangeLogStoreTest.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/MemoryChangeLogStoreTest.java?rev=593828&view=auto
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/MemoryChangeLogStoreTest.java (added)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/MemoryChangeLogStoreTest.java Sat Nov 10 15:58:02 2007
@@ -0,0 +1,77 @@
+/*
+ * 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 junit.framework.TestCase;
+import org.apache.directory.server.core.authn.LdapPrincipal;
+import org.apache.directory.shared.ldap.ldif.ChangeType;
+import org.apache.directory.shared.ldap.ldif.Entry;
+import org.apache.directory.shared.ldap.ldif.LdifUtils;
+import org.apache.directory.shared.ldap.message.AddRequest;
+import org.apache.directory.shared.ldap.message.AddRequestImpl;
+import org.apache.directory.shared.ldap.name.LdapDN;
+
+import javax.naming.InvalidNameException;
+import javax.naming.NamingException;
+
+
+/**
+ * Tests the MemoryChangeLogStore.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class MemoryChangeLogStoreTest extends TestCase
+{
+ MemoryChangeLogStore store;
+
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ store = new MemoryChangeLogStore();
+ }
+
+
+ public void tearDown() throws Exception
+ {
+ super.tearDown();
+ store = null;
+ }
+
+
+ public void testLogCheckRevision() throws NamingException
+ {
+ assertEquals( "first revision is always 0", 0, store.getCurrentRevision() );
+
+ Entry forward = new Entry();
+ forward.setDn( "ou=system" );
+ forward.setChangeType( ChangeType.Add );
+ forward.putAttribute( "objectClass", "organizationalUnit" );
+ forward.putAttribute( "ou", "system" );
+
+ AddRequest addRequest = new AddRequestImpl( 0 );
+ addRequest.setAttributes( forward.getAttributes() );
+ addRequest.setEntry( new LdapDN( forward.getDn() ) );
+ Entry reverse = LdifUtils.reverseAdd( addRequest );
+ assertEquals( 1, store.log( new LdapPrincipal(), forward, reverse ) );
+ assertEquals( 1, store.getCurrentRevision() );
+ }
+}
\ No newline at end of file
Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/TaggableChangeLogStore.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/TaggableChangeLogStore.java?rev=593828&r1=593827&r2=593828&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/TaggableChangeLogStore.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/changelog/TaggableChangeLogStore.java Sat Nov 10 15:58:02 2007
@@ -49,4 +49,13 @@
* @throws NamingException if there is a problem taking a tag
*/
Tag tag() throws NamingException;
+
+ /**
+ * Creates a snapshot of the server at the current revision with a description
+ * of the snapshot tag.
+ *
+ * @return the revision at which the tag is created
+ * @throws NamingException if there is a problem taking a tag
+ */
+ Tag tag( String description ) throws NamingException;
}