From 58612d6e94fb33672d29350f25ca45e4004c1751 Mon Sep 17 00:00:00 2001
From: Ludovic Poitou <ludovic.poitou@forgerock.com>
Date: Thu, 04 Aug 2011 16:16:48 +0000
Subject: [PATCH] Fix OPENDJ-252. Control Panel fails with a Null Pointer Exception with JDK7. Thanks to jvergara who provided a quick fix to OpenDS.

---
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/BaseDNDescriptor.java  |   25 +++++++++---
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java   |   10 ++--
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromFile.java         |   10 ++--
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/BackendDescriptor.java |   43 +++++++++++++--------
 4 files changed, 55 insertions(+), 33 deletions(-)

diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/BackendDescriptor.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/BackendDescriptor.java
index 8ffc94d..54ce99f 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/BackendDescriptor.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/BackendDescriptor.java
@@ -22,13 +22,14 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2011 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.datamodel;
 
-import java.util.Collections;
+import java.util.Set;
 import java.util.SortedSet;
+import java.util.TreeSet;
 
 import org.opends.admin.ads.ADSContext;
 
@@ -38,15 +39,15 @@
  */
 public class BackendDescriptor
 {
-  private String backendID;
+  private final String backendID;
   private SortedSet<BaseDNDescriptor> baseDns;
   private SortedSet<IndexDescriptor> indexes;
   private SortedSet<VLVIndexDescriptor> vlvIndexes;
   private int entries;
-  private boolean isConfigBackend;
-  private boolean isEnabled;
+  private final boolean isConfigBackend;
+  private final boolean isEnabled;
   private CustomSearchResult monitoringEntry;
-  private Type type;
+  private final Type type;
   private int hashCode;
 
   /**
@@ -95,20 +96,17 @@
    * @param type the type of the backend.
    */
   public BackendDescriptor(String backendID,
-      SortedSet<BaseDNDescriptor> baseDns,
-      SortedSet<IndexDescriptor> indexes,
-      SortedSet<VLVIndexDescriptor> vlvIndexes,
+      Set<BaseDNDescriptor> baseDns,
+      Set<IndexDescriptor> indexes,
+      Set<VLVIndexDescriptor> vlvIndexes,
       int entries, boolean isEnabled, Type type)
   {
     this.backendID = backendID;
-    this.baseDns = Collections.unmodifiableSortedSet(baseDns);
-    this.indexes = Collections.unmodifiableSortedSet(indexes);
-    this.vlvIndexes = Collections.unmodifiableSortedSet(vlvIndexes);
     this.entries = entries;
     isConfigBackend = isConfigBackend(backendID);
     this.type = type;
     this.isEnabled = isEnabled;
-    updateBaseDnsAndIndexes();
+    updateBaseDnsAndIndexes(baseDns, indexes, vlvIndexes);
     recalculateHashCode();
   }
 
@@ -162,6 +160,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean equals(Object v)
   {
     boolean equals = false;
@@ -221,6 +220,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public int hashCode()
   {
     return hashCode;
@@ -252,23 +252,32 @@
 
   /**
    * Updates the base DNs and indexes contained in this backend so that they
-   * have a reference to this backend.
+   * have a reference to this backend.  It also initialize the members of this
+   * class with the base DNs and indexes.
+   * @param baseDns the base DNs associated with the Backend.
+   * @param indexes the indexes defined in the backend.
+   * @param vlvIndexes the VLV indexes defined in the backend.
    *
    */
-  private void updateBaseDnsAndIndexes()
+  private void updateBaseDnsAndIndexes(Set<BaseDNDescriptor> baseDns,
+      Set<IndexDescriptor> indexes,
+      Set<VLVIndexDescriptor> vlvIndexes)
   {
     for (BaseDNDescriptor baseDN : baseDns)
     {
       baseDN.setBackend(this);
     }
-    for (AbstractIndexDescriptor index : indexes)
+    this.baseDns = new TreeSet<BaseDNDescriptor>(baseDns);
+    for (IndexDescriptor index : indexes)
     {
       index.setBackend(this);
     }
-    for (AbstractIndexDescriptor index : vlvIndexes)
+    this.indexes = new TreeSet<IndexDescriptor>(indexes);
+    for (VLVIndexDescriptor index : vlvIndexes)
     {
       index.setBackend(this);
     }
+    this.vlvIndexes = new TreeSet<VLVIndexDescriptor>(vlvIndexes);
   }
 
   /**
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/BaseDNDescriptor.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/BaseDNDescriptor.java
index 47ed803c..4bdd0e4 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/BaseDNDescriptor.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/BaseDNDescriptor.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008-2010 Sun Microsystems, Inc.
+ *      Copyright 2008-2011 Sun Microsystems, Inc.
  *      Portions Copyright 2011 ForgeRock AS
  */
 
@@ -58,7 +58,7 @@
   private BackendDescriptor backend;
   private long ageOfOldestMissingChange;
   private Type type;
-  private DN baseDn;
+  private final DN baseDn;
   private int replicaID = -1;
 
   private int hashCode;
@@ -100,6 +100,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean equals(Object v)
   {
     boolean equals = false;
@@ -112,9 +113,16 @@
         getDn().equals(desc.getDn()) &&
         (getAgeOfOldestMissingChange() == desc.getAgeOfOldestMissingChange()) &&
         (getMissingChanges() == desc.getMissingChanges()) &&
-        getBackend().getBackendID().equals(
-            desc.getBackend().getBackendID()) &&
         (getEntries() == desc.getEntries());
+        if (equals)
+        {
+          if ((getBackend() != null) && (desc.getBackend() != null))
+          {
+            // Only compare the backend IDs.  In this context is enough
+            equals = getBackend().getBackendID().equals(
+                desc.getBackend().getBackendID());
+          }
+        }
       }
     }
     else
@@ -127,6 +135,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public int hashCode()
   {
     return hashCode;
@@ -145,8 +154,12 @@
     }
     if (returnValue == 0)
     {
-      returnValue = getBackend().getBackendID().compareTo(
-          desc.getBackend().getBackendID());
+      if ((getBackend() != null) && (desc.getBackend() != null))
+      {
+        // Only compare the backend IDs. In this context is enough
+        returnValue = getBackend().getBackendID().compareTo(
+            desc.getBackend().getBackendID());
+      }
     }
     if (returnValue == 0)
     {
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java
index 9bde4e1..0b64817 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008-2010 Sun Microsystems, Inc.
+ *      Copyright 2008-2011 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.util;
@@ -310,7 +310,7 @@
         try
         {
           BackendCfgClient backend = root.getBackend(backendNames[i]);
-          SortedSet<BaseDNDescriptor> baseDNs = new TreeSet<BaseDNDescriptor>();
+          Set<BaseDNDescriptor> baseDNs = new HashSet<BaseDNDescriptor>();
           for (DN dn : backend.getBaseDN())
           {
             BaseDNDescriptor baseDN =
@@ -318,9 +318,9 @@
                   null, -1, -1, -1);
             baseDNs.add(baseDN);
           }
-          SortedSet<IndexDescriptor> indexes = new TreeSet<IndexDescriptor>();
-          SortedSet<VLVIndexDescriptor> vlvIndexes =
-            new TreeSet<VLVIndexDescriptor>();
+          Set<IndexDescriptor> indexes = new HashSet<IndexDescriptor>();
+          Set<VLVIndexDescriptor> vlvIndexes =
+            new HashSet<VLVIndexDescriptor>();
           BackendDescriptor.Type type;
           if (backend instanceof LocalDBBackendCfgClient)
           {
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromFile.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromFile.java
index c6f0963..c71a78f 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromFile.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromFile.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008-2010 Sun Microsystems, Inc.
+ *      Copyright 2008-2011 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.util;
@@ -165,7 +165,7 @@
         try
         {
           BackendCfg backend = root.getBackend(backendNames[i]);
-          SortedSet<BaseDNDescriptor> baseDNs = new TreeSet<BaseDNDescriptor>();
+          Set<BaseDNDescriptor> baseDNs = new HashSet<BaseDNDescriptor>();
           for (DN dn : backend.getBaseDN())
           {
             BaseDNDescriptor baseDN =
@@ -173,9 +173,9 @@
                   null, -1, -1, -1);
             baseDNs.add(baseDN);
           }
-          SortedSet<IndexDescriptor> indexes = new TreeSet<IndexDescriptor>();
-          SortedSet<VLVIndexDescriptor> vlvIndexes =
-            new TreeSet<VLVIndexDescriptor>();
+          Set<IndexDescriptor> indexes = new HashSet<IndexDescriptor>();
+          Set<VLVIndexDescriptor> vlvIndexes =
+            new HashSet<VLVIndexDescriptor>();
           BackendDescriptor.Type type;
           if (backend instanceof LocalDBBackendCfg)
           {

--
Gitblit v1.10.0