From 5afaf8dfb9b64d9dc2a55baf85b352d8dd59e039 Mon Sep 17 00:00:00 2001
From: dugan <dugan@localhost>
Date: Mon, 29 Oct 2007 21:07:19 +0000
Subject: [PATCH] Second try. Fix SEVERE_WARNING error message on replicationChanges database. Also, added implementations of missing methods and fixed null pointer exception when doing export-ldif without running as a task. Issue 2350.

---
 opends/src/server/org/opends/server/replication/server/ReplicationBackend.java |  120 +++++++++++++++++++++++++++++++++++++--
 opends/src/messages/messages/replication.properties                            |    7 ++
 opends/src/server/org/opends/server/core/GroupManager.java                     |   11 ++-
 3 files changed, 124 insertions(+), 14 deletions(-)

diff --git a/opends/src/messages/messages/replication.properties b/opends/src/messages/messages/replication.properties
index 204b338..dea3c33 100644
--- a/opends/src/messages/messages/replication.properties
+++ b/opends/src/messages/messages/replication.properties
@@ -245,4 +245,9 @@
   or require a full resynchronization
 NOTICE_HEARTBEAT_FAILURE_97=%s is closing the session \
  because it could not detect a heartbeat
-  
\ No newline at end of file
+SEVERE_ERR_REPLICATONBACKEND_IMPORT_LDIF_NOT_SUPPORTED_98=The replication \
+  server backend does not support the import ldif function
+SEVERE_ERR_REPLICATONBACKEND_EXPORT_LDIF_FAILED_99=The replication \
+  server backend cannot export its entries in LDIF format because the \
+  export-ldif command must be run as a task
+
diff --git a/opends/src/server/org/opends/server/core/GroupManager.java b/opends/src/server/org/opends/server/core/GroupManager.java
index 894be26..dfeb91a 100644
--- a/opends/src/server/org/opends/server/core/GroupManager.java
+++ b/opends/src/server/org/opends/server/core/GroupManager.java
@@ -29,10 +29,7 @@
 
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.opends.messages.Message;
@@ -583,6 +580,9 @@
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
 
+    LinkedList<Control> requestControls = new LinkedList<Control>();
+    requestControls.add(new Control(OID_INTERNAL_GROUP_MEMBERSHIP_UPDATE,
+                                    false));
     for (DN configEntryDN : groupImplementations.keySet())
     {
       SearchFilter filter;
@@ -631,7 +631,8 @@
 
         InternalSearchOperation internalSearch =
              new InternalSearchOperation(conn, conn.nextOperationID(),
-                                         conn.nextMessageID(), null, baseDN,
+                                         conn.nextMessageID(), requestControls,
+                                         baseDN,
                                          SearchScope.WHOLE_SUBTREE,
                                          DereferencePolicy.NEVER_DEREF_ALIASES,
                                          0, 0, false, filter, null, null);
diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationBackend.java b/opends/src/server/org/opends/server/replication/server/ReplicationBackend.java
index 03b018c..80e3822 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationBackend.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationBackend.java
@@ -44,6 +44,7 @@
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
+import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -83,6 +84,7 @@
 import org.opends.server.types.DN;
 import org.opends.server.types.DebugLogLevel;
 import org.opends.server.types.DirectoryException;
+import org.opends.server.types.DereferencePolicy;
 import org.opends.server.types.Entry;
 import org.opends.server.types.IndexType;
 import org.opends.server.types.InitializationException;
@@ -94,6 +96,8 @@
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.types.SearchScope;
+import org.opends.server.types.SearchResultEntry;
+import org.opends.server.types.ObjectClass;
 import org.opends.server.util.AddChangeRecordEntry;
 import org.opends.server.util.DeleteChangeRecordEntry;
 import org.opends.server.util.LDIFReader;
@@ -101,6 +105,10 @@
 import org.opends.server.util.ModifyChangeRecordEntry;
 import org.opends.server.util.ModifyDNChangeRecordEntry;
 import org.opends.server.util.Validator;
+import static org.opends.server.config.ConfigConstants.ATTR_OBJECTCLASSES_LC;
+import org.opends.server.protocols.internal.InternalSearchOperation;
+import static org.opends.server.util.ServerConstants.*;
+
 
 /**
  * This class defines a backend that stores its information in an
@@ -162,6 +170,16 @@
    */
   private long skippedCount = 0;
 
+  //Objectclass for getEntry root entries.
+  private HashMap<ObjectClass,String> rootObjectclasses;
+
+  //Attributes used for getEntry root entries.
+  private LinkedHashMap<AttributeType,List<Attribute>> attributes;
+
+  //Operational attributes used for getEntry root entries.
+  private Map<AttributeType,List<Attribute>> operationalAttributes;
+
+
   /**
    * Creates a new backend with the provided information.  All backend
    * implementations must implement a default constructor that use
@@ -247,6 +265,24 @@
         throw new InitializationException(message, e);
       }
     }
+    rootObjectclasses = new LinkedHashMap<ObjectClass,String>(3);
+    rootObjectclasses.put(DirectoryServer.getTopObjectClass(), OC_TOP);
+    ObjectClass domainOC = DirectoryServer.getObjectClass("domain", true);
+    rootObjectclasses.put(domainOC, "domain");
+    ObjectClass objectclassOC =
+                   DirectoryServer.getObjectClass(ATTR_OBJECTCLASSES_LC, true);
+    rootObjectclasses.put(objectclassOC, ATTR_OBJECTCLASSES_LC);
+    attributes = new LinkedHashMap<AttributeType,List<Attribute>>();
+    AttributeType changeType =
+    DirectoryServer.getAttributeType("changetype", true);
+    LinkedHashSet<AttributeValue> valueSet =
+                                           new LinkedHashSet<AttributeValue>(1);
+    valueSet.add(new AttributeValue(changeType, "add"));
+    Attribute a = new Attribute(changeType, "changetype", valueSet);
+    ArrayList<Attribute> attrList = new ArrayList<Attribute>(1);
+    attrList.add(a);
+    attributes.put(changeType, attrList);
+    operationalAttributes = new LinkedHashMap<AttributeType,List<Attribute>>();
   }
 
 
@@ -292,7 +328,29 @@
   @Override()
   public synchronized long getEntryCount()
   {
-    return -1;
+    //This method only returns the number of actual change entries, the
+    //domain and any baseDN entries are not counted.
+    long retNum=0;
+    try {
+        InternalClientConnection conn =
+                    InternalClientConnection.getRootConnection();
+        SearchFilter filter=
+                       SearchFilter.createFilterFromString("(changetype=*)");
+        InternalSearchOperation searchOperation =
+                new InternalSearchOperation(conn,
+                        InternalClientConnection.nextOperationID(),
+                        InternalClientConnection.nextMessageID(), null,
+                        baseDNs[0],
+                        SearchScope.WHOLE_SUBTREE,
+                        DereferencePolicy.NEVER_DEREF_ALIASES, 0, 0, false,
+                        filter, null, null);
+      search(searchOperation);
+      retNum=searchOperation.getSearchEntries().size();
+    } catch (DirectoryException ex) {
+      retNum=0;
+    }
+    return retNum;
+
   }
 
 
@@ -314,8 +372,7 @@
   @Override()
   public boolean isIndexed(AttributeType attributeType, IndexType indexType)
   {
-    // This needs to be updated when the backend implementation is complete.
-    return false;
+    return true;
   }
 
 
@@ -326,7 +383,35 @@
   @Override()
   public synchronized Entry getEntry(DN entryDN)
   {
-    return null;
+    Entry e = null;
+    try {
+      if(baseDNSet.contains(entryDN)) {
+           return new Entry(entryDN, rootObjectclasses, attributes,
+                            operationalAttributes);
+      } else {
+        InternalClientConnection conn =
+                InternalClientConnection.getRootConnection();
+        SearchFilter filter=
+                SearchFilter.createFilterFromString("(changetype=*)");
+        InternalSearchOperation searchOperation =
+                new InternalSearchOperation(conn,
+                        InternalClientConnection.nextOperationID(),
+                        InternalClientConnection.nextMessageID(), null, entryDN,
+                        SearchScope.BASE_OBJECT,
+                        DereferencePolicy.NEVER_DEREF_ALIASES, 0, 0, false,
+                        filter, null, null);
+        search(searchOperation);
+        LinkedList<SearchResultEntry> resultEntries =
+                searchOperation.getSearchEntries();
+        if(resultEntries.size() != 0) {
+          e=resultEntries.getFirst();
+        }
+      }
+    } catch (DirectoryException ex) {
+      e=null;
+    }
+    return e;
+
   }
 
 
@@ -337,7 +422,7 @@
   @Override()
   public synchronized boolean entryExists(DN entryDN)
   {
-    return false;
+   return getEntry(entryDN) != null;
   }
 
 
@@ -441,7 +526,10 @@
     DN baseDN;
     ArrayList<ReplicationCache> exportContainers =
       new ArrayList<ReplicationCache>();
-
+    if(server == null) {
+       Message message = ERR_REPLICATONBACKEND_EXPORT_LDIF_FAILED.get();
+      throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM,message);
+    }
     Iterator<ReplicationCache> rcachei = server.getCacheIterator();
     if (rcachei != null)
     {
@@ -865,7 +953,8 @@
   public synchronized LDIFImportResult importLDIF(LDIFImportConfig importConfig)
          throws DirectoryException
   {
-      return new LDIFImportResult(0, 0, 0);
+    Message message = ERR_REPLICATONBACKEND_IMPORT_LDIF_NOT_SUPPORTED.get();
+    throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message);
   }
 
 
@@ -1058,7 +1147,22 @@
           ResultCode.NO_SUCH_OBJECT, message, null, null);
       }
     }
-
+    //This check is for GroupManager initialization. It currently doesn't
+    //come into play because the replication server variable is null in
+    //the check above. But if the order of initialization of the server variable
+    //is ever changed, the following check will keep replication change entries
+    //from being added to the groupmanager cache erroneously.
+    List<Control> requestControls = searchOperation.getRequestControls();
+    if (requestControls != null)
+    {
+      for (Control c : requestControls)
+      {
+        if (c.getOID().equals(OID_INTERNAL_GROUP_MEMBERSHIP_UPDATE))
+        {
+          return;
+        }
+      }
+    }
     // Make sure the base entry exists if it's supposed to be in this backend.
     if (!handlesEntry(searchBaseDN))
     {

--
Gitblit v1.10.0