From 9d37eff04e2be94b116fd439678b3bca13be2e90 Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 03 Feb 2016 10:15:53 +0000
Subject: [PATCH] Factorized duplicated code into VLVIndex

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java       |  125 +++++++++++++++++++++--------------------
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java |   45 --------------
 2 files changed, 64 insertions(+), 106 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java
index c6f4b84..7622af0 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java
@@ -108,7 +108,6 @@
 import org.opends.server.types.Privilege;
 import org.opends.server.types.RDN;
 import org.opends.server.types.SearchFilter;
-import org.opends.server.types.SortKey;
 import org.opends.server.types.SortOrder;
 import org.opends.server.types.VirtualAttributeRule;
 import org.opends.server.util.ServerConstants;
@@ -276,49 +275,7 @@
     @Override
     public boolean isConfigurationAddAcceptable(BackendVLVIndexCfg cfg, List<LocalizableMessage> unacceptableReasons)
     {
-      // TODO JNR remove du-plication
-      try
-      {
-        SearchFilter.createFilterFromString(cfg.getFilter());
-      }
-      catch(Exception e)
-      {
-        unacceptableReasons.add(ERR_CONFIG_VLV_INDEX_BAD_FILTER.get(
-            cfg.getFilter(), cfg.getName(), e.getLocalizedMessage()));
-        return false;
-      }
-
-      String[] sortAttrs = cfg.getSortOrder().split(" ");
-      SortKey[] sortKeys = new SortKey[sortAttrs.length];
-      boolean[] ascending = new boolean[sortAttrs.length];
-      for(int i = 0; i < sortAttrs.length; i++)
-      {
-        try
-        {
-          ascending[i] = !sortAttrs[i].startsWith("-");
-
-          if (sortAttrs[i].startsWith("-") || sortAttrs[i].startsWith("+"))
-          {
-            sortAttrs[i] = sortAttrs[i].substring(1);
-          }
-        }
-        catch(Exception e)
-        {
-          unacceptableReasons.add(ERR_CONFIG_VLV_INDEX_UNDEFINED_ATTR.get(sortKeys[i], cfg.getName()));
-          return false;
-        }
-
-        AttributeType attrType = DirectoryServer.getAttributeType(sortAttrs[i]);
-        if (attrType.isPlaceHolder())
-        {
-          unacceptableReasons.add(ERR_CONFIG_VLV_INDEX_UNDEFINED_ATTR.get(sortAttrs[i], cfg.getName()));
-          return false;
-        }
-        // TODO Add ordering matching rule null check
-        sortKeys[i] = new SortKey(attrType, ascending[i]);
-      }
-
-      return true;
+      return VLVIndex.isConfigurationAddAcceptable(cfg, unacceptableReasons);
     }
 
     @Override
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java
index 33a94db..b674f3f 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java
@@ -27,6 +27,7 @@
 package org.opends.server.backends.pluggable;
 
 import static org.opends.messages.BackendMessages.*;
+import static org.opends.messages.ProtocolMessages.*;
 import static org.opends.server.backends.pluggable.EntryIDSet.*;
 import static org.opends.server.backends.pluggable.IndexFilter.*;
 import static org.opends.server.util.StaticUtils.*;
@@ -127,17 +128,14 @@
     this.scope = convertScope(config.getScope());
     this.storage = storage;
 
-    try
+    final ConfigChangeResult ccr = new ConfigChangeResult();
+    this.filter = parseSearchFilter(config, getName().toString(), ccr);
+    this.sortOrder = new SortOrder(parseSortKeys(config.getSortOrder(), ccr));
+    if (!ccr.getMessages().isEmpty())
     {
-      this.filter = SearchFilter.createFilterFromString(config.getFilter());
-    }
-    catch (final Exception e)
-    {
-      throw new ConfigException(ERR_CONFIG_VLV_INDEX_BAD_FILTER.get(
-          config.getFilter(), getName(), stackTraceToSingleLineString(e)));
+      throw new ConfigException(ccr.getMessages().get(0));
     }
 
-    this.sortOrder = new SortOrder(parseSortKeys(config.getSortOrder()));
     this.state = state;
     this.trusted = state.getIndexFlags(txn, getName()).contains(IndexFlag.TRUSTED);
     if (!trusted && entryContainer.getHighestEntryID(txn).longValue() == 0)
@@ -188,30 +186,43 @@
   public synchronized boolean isConfigurationChangeAcceptable(final BackendVLVIndexCfg cfg,
       final List<LocalizableMessage> unacceptableReasons)
   {
-    // TODO JNR remove duplication
+    return isConfigurationAcceptable(cfg, getName().toString(), unacceptableReasons);
+  }
+
+  static boolean isConfigurationAddAcceptable(BackendVLVIndexCfg cfg, List<LocalizableMessage> unacceptableReasons)
+  {
+    return isConfigurationAcceptable(cfg, cfg.getName(), unacceptableReasons);
+  }
+
+  private static boolean isConfigurationAcceptable(BackendVLVIndexCfg cfg,
+      String indexName, List<LocalizableMessage> unacceptableReasons)
+  {
+    final ConfigChangeResult ccr = new ConfigChangeResult();
+    parseSearchFilter(cfg, indexName, ccr);
+    parseSortKeys(cfg.getSortOrder(), ccr, indexName);
+    if (!ccr.getMessages().isEmpty())
+    {
+      unacceptableReasons.addAll(ccr.getMessages());
+      return false;
+    }
+    return true;
+  }
+
+  private static SearchFilter parseSearchFilter(final BackendVLVIndexCfg cfg, String indexName,
+      final ConfigChangeResult ccr)
+  {
     try
     {
-      SearchFilter.createFilterFromString(cfg.getFilter());
+      SearchFilter result = SearchFilter.createFilterFromString(cfg.getFilter());
+      ccr.setAdminActionRequired(true);
+      return result;
     }
     catch (final Exception e)
     {
-      final LocalizableMessage msg = ERR_CONFIG_VLV_INDEX_BAD_FILTER.get(
-          cfg.getFilter(), getName(), stackTraceToSingleLineString(e));
-      unacceptableReasons.add(msg);
-      return false;
+      ccr.setResultCode(ResultCode.INVALID_ATTRIBUTE_SYNTAX);
+      ccr.addMessage(ERR_CONFIG_VLV_INDEX_BAD_FILTER.get(cfg.getFilter(), indexName, stackTraceToSingleLineString(e)));
+      return null;
     }
-
-    try
-    {
-      parseSortKeys(cfg.getSortOrder());
-    }
-    catch (final ConfigException e)
-    {
-      unacceptableReasons.add(e.getMessageObject());
-      return false;
-    }
-
-    return true;
   }
 
   @Override
@@ -256,31 +267,13 @@
     // Update the filter only if changed
     if (!config.getFilter().equals(cfg.getFilter()))
     {
-      try
-      {
-        this.filter = SearchFilter.createFilterFromString(cfg.getFilter());
-        ccr.setAdminActionRequired(true);
-      }
-      catch (final Exception e)
-      {
-        ccr.addMessage(ERR_CONFIG_VLV_INDEX_BAD_FILTER.get(config.getFilter(), getName(),
-            stackTraceToSingleLineString(e)));
-        ccr.setResultCode(ResultCode.INVALID_ATTRIBUTE_SYNTAX);
-      }
+      this.filter = parseSearchFilter(cfg, getName().toString(), ccr);
     }
 
     // Update the sort order only if changed
     if (!config.getSortOrder().equals(cfg.getSortOrder()))
     {
-      try
-      {
-        this.sortOrder = new SortOrder(parseSortKeys(cfg.getSortOrder()));
-      }
-      catch (final ConfigException e)
-      {
-        ccr.addMessage(e.getMessageObject());
-        ccr.setResultCode(ResultCode.INVALID_ATTRIBUTE_SYNTAX);
-      }
+      this.sortOrder = new SortOrder(parseSortKeys(cfg.getSortOrder(), ccr));
       ccr.setAdminActionRequired(true);
     }
 
@@ -302,40 +295,48 @@
     this.config = cfg;
   }
 
-  private SortKey[] parseSortKeys(final String sortOrder) throws ConfigException
+  private SortKey[] parseSortKeys(final String sortOrder, ConfigChangeResult ccr)
+  {
+    return parseSortKeys(sortOrder, ccr, getName().toString());
+  }
+
+  private static SortKey[] parseSortKeys(final String sortOrder, ConfigChangeResult ccr, String indexName)
   {
     final String[] sortAttrs = sortOrder.split(" ");
     final SortKey[] sortKeys = new SortKey[sortAttrs.length];
     for (int i = 0; i < sortAttrs.length; i++)
     {
+      String sortAttr = sortAttrs[i];
       final boolean ascending;
       try
       {
-        if (sortAttrs[i].startsWith("-"))
+        ascending = !sortAttr.startsWith("-");
+
+        if (sortAttr.startsWith("-") || sortAttr.startsWith("+"))
         {
-          ascending = false;
-          sortAttrs[i] = sortAttrs[i].substring(1);
-        }
-        else
-        {
-          ascending = true;
-          if (sortAttrs[i].startsWith("+"))
-          {
-            sortAttrs[i] = sortAttrs[i].substring(1);
-          }
+          sortAttr = sortAttr.substring(1);
         }
       }
       catch (final Exception e)
       {
-        throw new ConfigException(ERR_CONFIG_VLV_INDEX_UNDEFINED_ATTR.get(sortKeys[i], getName()));
+        ccr.setResultCode(ResultCode.INVALID_ATTRIBUTE_SYNTAX);
+        ccr.addMessage(ERR_CONFIG_VLV_INDEX_UNDEFINED_ATTR.get(sortAttr, indexName));
+        return null;
       }
 
-      final AttributeType attrType = DirectoryServer.getAttributeType(sortAttrs[i]);
+      final AttributeType attrType = DirectoryServer.getAttributeType(sortAttr);
       if (attrType.isPlaceHolder())
       {
-        throw new ConfigException(ERR_CONFIG_VLV_INDEX_UNDEFINED_ATTR.get(sortAttrs[i], getName()));
+        ccr.setResultCode(ResultCode.INVALID_ATTRIBUTE_SYNTAX);
+        ccr.addMessage(ERR_CONFIG_VLV_INDEX_UNDEFINED_ATTR.get(sortAttr, indexName));
+        return null;
       }
-      // TODO Add ordering matching rule null check
+      if (attrType.getOrderingMatchingRule() == null)
+      {
+        ccr.setResultCode(ResultCode.CONSTRAINT_VIOLATION);
+        ccr.addMessage(INFO_SORTREQ_CONTROL_NO_ORDERING_RULE_FOR_ATTR.get(attrType.getNameOrOID()));
+        return null;
+      }
       sortKeys[i] = new SortKey(attrType, ascending);
     }
     return sortKeys;

--
Gitblit v1.10.0