You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by sa...@apache.org on 2011/11/17 10:23:58 UTC
svn commit: r1203122 [2/2] - in /directory/apacheds/branches/apacheds-txns:
core-api/src/main/java/org/apache/directory/server/core/api/partition/
core-api/src/main/java/org/apache/directory/server/core/api/txn/logedit/
core-shared/src/main/java/org/ap...
Added: directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/EntryReplace.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/EntryReplace.java?rev=1203122&view=auto
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/EntryReplace.java (added)
+++ directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/EntryReplace.java Thu Nov 17 09:23:57 2011
@@ -0,0 +1,88 @@
+
+package org.apache.directory.server.core.shared.txn.logedit;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.UUID;
+
+import org.apache.directory.server.core.api.partition.Partition;
+import org.apache.directory.server.core.api.txn.logedit.AbstractDataChange;
+import org.apache.directory.server.core.api.txn.logedit.EntryModification;
+import org.apache.directory.shared.ldap.model.entry.DefaultEntry;
+import org.apache.directory.shared.ldap.model.entry.Entry;
+
+public class EntryReplace extends AbstractDataChange implements EntryModification
+{
+ /** New Entry */
+ private Entry newEntry;
+
+ /** Old enty */
+ private Entry oldEntry;
+
+ // For externalizable
+ public EntryReplace()
+ {
+
+ }
+
+ public EntryReplace( Entry newEntry, Entry oldEntry )
+ {
+ this.newEntry = newEntry;
+ this.oldEntry = oldEntry;
+ }
+
+
+ public Entry getNewEntry()
+ {
+ return newEntry;
+ }
+
+
+ public Entry getOldEntry()
+ {
+ return oldEntry;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public Entry applyModification( Partition partition, Entry curEntry, UUID entryId, long changeLsn, boolean recovery )
+ {
+ // Currently this log edit is only for existing exntries
+ if ( curEntry == null )
+ {
+ if ( recovery == false )
+ {
+ throw new IllegalStateException(" Trying to replace a non existing entry:" + entryId + " entry:" + newEntry);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ // TODO check the version of the entry and see which entry is more recent
+ return newEntry;
+ }
+
+
+ @Override
+ public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException
+ {
+ newEntry = new DefaultEntry();
+ newEntry.readExternal( in );
+
+ oldEntry = new DefaultEntry();
+ oldEntry.readExternal( in );
+ }
+
+
+ @Override
+ public void writeExternal( ObjectOutput out ) throws IOException
+ {
+ newEntry.writeExternal( out );
+ oldEntry.writeExternal( out );
+ }
+}
Modified: directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/IndexChange.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/IndexChange.java?rev=1203122&r1=1203121&r2=1203122&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/IndexChange.java (original)
+++ directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/IndexChange.java Thu Nov 17 09:23:57 2011
@@ -25,9 +25,11 @@ import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.UUID;
+import org.apache.directory.server.core.api.partition.Partition;
import org.apache.directory.server.core.api.partition.index.Index;
import org.apache.directory.server.core.api.partition.index.Serializer;
import org.apache.directory.server.core.api.txn.logedit.AbstractDataChange;
+import org.apache.directory.server.core.api.txn.logedit.IndexModification;
import org.apache.directory.server.core.shared.txn.TxnManagerFactory;
import org.apache.directory.shared.ldap.model.entry.Value;
@@ -37,7 +39,7 @@ import org.apache.directory.shared.ldap.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
-public class IndexChange extends AbstractDataChange
+public class IndexChange extends AbstractDataChange implements IndexModification
{
/** Index this change is done on */
private transient Index<?> index;
@@ -103,7 +105,53 @@ public class IndexChange extends Abstrac
return type;
}
-
+
+ /**
+ * {@inheritDoc}
+ */
+ public void applyModification( Partition partition, boolean recovery ) throws Exception
+ {
+ Index<Object> index = ( Index<Object> )partition.getIndex( oid );
+
+ if ( index == null )
+ {
+ // TODO decide how to handle index add drop
+ }
+
+ if ( type == Type.ADD )
+ {
+ // During recovery, idex might have already been added. But it should not hurt to readd the index entry.
+ index.add( key, id );
+ }
+ else // delete
+ {
+ if ( recovery == false )
+ {
+ index.drop( key, id );
+ }
+ else
+ {
+ //If forward or reverse index entry existence diffes, first add the index entry and then delete it.
+ boolean forwardExists = index.forward( key, id );
+ boolean reverseExists = index.reverse( id, key );
+
+ if ( forwardExists != reverseExists )
+ {
+ // We assume readding the same entry to an index wont hurt
+ index.add( key, id );
+
+ index.drop( key, id );
+ }
+ else if ( forwardExists )
+ {
+ // Index entry exists both for reverse and forward index
+ index.drop( key, id );
+ }
+ }
+ }
+ }
+
+
@Override
@SuppressWarnings("unchecked")
public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException