From e4437177e635426c1db490626005a4a3f500835d Mon Sep 17 00:00:00 2001
From: sin <sin@localhost>
Date: Mon, 30 Mar 2009 17:06:50 +0000
Subject: [PATCH] Issue# 3793: Can not create extensible indexes using the dsconfig

---
 /dev/null                                                                                  |  185 ------------------------------
 opendj-sdk/opends/src/server/org/opends/server/admin/PropertyDefinitionUsageBuilder.java   |   11 -
 opendj-sdk/opends/src/messages/messages/jeb.properties                                     |    2 
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java            |   50 +++++++-
 opendj-sdk/opends/src/server/org/opends/server/admin/PropertyValueVisitor.java             |   20 ---
 opendj-sdk/opends/src/admin/defn/org/opends/server/admin/std/LocalDBIndexConfiguration.xml |   14 +
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java               |   10 +
 opendj-sdk/opends/src/server/org/opends/server/admin/PropertyDefinitionVisitor.java        |   16 --
 8 files changed, 64 insertions(+), 244 deletions(-)

diff --git a/opendj-sdk/opends/src/admin/defn/org/opends/server/admin/std/LocalDBIndexConfiguration.xml b/opendj-sdk/opends/src/admin/defn/org/opends/server/admin/std/LocalDBIndexConfiguration.xml
index cfb2ad9..5768672 100644
--- a/opendj-sdk/opends/src/admin/defn/org/opends/server/admin/std/LocalDBIndexConfiguration.xml
+++ b/opendj-sdk/opends/src/admin/defn/org/opends/server/admin/std/LocalDBIndexConfiguration.xml
@@ -212,9 +212,17 @@
         </adm:synopsis>
       </adm:alias>
     </adm:default-behavior>
-    <adm:syntax>
-      <adm:extensible-matching-rule-type/>
-    </adm:syntax>
+ <adm:syntax>
+     <adm:string>
+       <adm:pattern>
+          <adm:regex>([a-z][a-z](-[A-Z][A-Z]){0,2}(.(([a-z]{2,3})|\\d))?)|(^\\d.((\\d)+.)+\\d$)</adm:regex>
+          <adm:usage>LOCALE | OID</adm:usage>
+          <adm:synopsis>
+            A Locale or an OID.
+          </adm:synopsis>
+        </adm:pattern>
+       </adm:string>
+   </adm:syntax>
     <adm:profile name="ldap">
       <ldap:attribute>
         <ldap:name>ds-cfg-index-extensible-matching-rule</ldap:name>
diff --git a/opendj-sdk/opends/src/messages/messages/jeb.properties b/opendj-sdk/opends/src/messages/messages/jeb.properties
index e915037..8f658d9 100644
--- a/opendj-sdk/opends/src/messages/messages/jeb.properties
+++ b/opendj-sdk/opends/src/messages/messages/jeb.properties
@@ -356,3 +356,5 @@
   %d entries
 MILD_WARN_BACKUPDB_INCREMENTAL_NOT_FOUND_DOING_NORMAL_191=Could not find any \
  backup in '%s'.  A full backup will be executed
+SEVERE_ERR_CONFIG_INDEX_TYPE_NEEDS_VALID_MATCHING_RULE_192=The attribute '%s' \
+cannot have extensible index type for invalid matching rule name '%s'
diff --git a/opendj-sdk/opends/src/server/org/opends/server/admin/ExtensibleMatchingRuleTypePropertyDefinition.java b/opendj-sdk/opends/src/server/org/opends/server/admin/ExtensibleMatchingRuleTypePropertyDefinition.java
deleted file mode 100644
index 25dbde0..0000000
--- a/opendj-sdk/opends/src/server/org/opends/server/admin/ExtensibleMatchingRuleTypePropertyDefinition.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE
- * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
- * add the following below this CDDL HEADER, with the fields enclosed
- * by brackets "[]" replaced with your own identifying information:
- *      Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- *
- *
- *      Copyright 2009 Sun Microsystems, Inc.
- */
-
-package org.opends.server.admin;
-
-import java.util.EnumSet;
-import org.opends.server.api.ExtensibleMatchingRule;
-
-import org.opends.server.core.DirectoryServer;
-import static org.opends.server.util.Validator.ensureNotNull;
-
-/**
- * Extensible Matching Rule Type Propertiy Definition.
- */
-public final class ExtensibleMatchingRuleTypePropertyDefinition
-        extends PropertyDefinition<ExtensibleMatchingRule>
-{
-
-  /**
-   * An interface for incrementally constructing attribute type
-   * property definitions.
-   */
-  public static class Builder extends
-      AbstractBuilder<ExtensibleMatchingRule,
-                                ExtensibleMatchingRuleTypePropertyDefinition> {
-
-    // Private constructor
-    private Builder(AbstractManagedObjectDefinition<?, ?> d,
-        String propertyName) {
-      super(d, propertyName);
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected ExtensibleMatchingRuleTypePropertyDefinition buildInstance(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-        EnumSet<PropertyOption> options,
-        AdministratorAction adminAction,
-        DefaultBehaviorProvider<ExtensibleMatchingRule> defaultBehavior) {
-      return new ExtensibleMatchingRuleTypePropertyDefinition(d, propertyName,
-          options, adminAction, defaultBehavior);
-    }
-  }
-
-
-  /**
-   * Create an extensible matching rule type property definition builder.
-   *
-   * @param d
-   *          The managed object definition associated with this
-   *          property definition.
-   * @param propertyName
-   *          The property name.
-   * @return Returns the new attribute type property definition
-   *         builder.
-   */
-  public static Builder createBuilder(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-    return new Builder(d, propertyName);
-  }
-
-
-
-  /**
-   * Creates a new insantce of this class.
-   */
-  private ExtensibleMatchingRuleTypePropertyDefinition(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-      EnumSet<PropertyOption> options,
-      AdministratorAction adminAction,
-      DefaultBehaviorProvider<ExtensibleMatchingRule> defaultBehavior) {
-    super(d, ExtensibleMatchingRule.class, propertyName, options,
-        adminAction, defaultBehavior);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
-    return v.visitExtensibleMatchingRuleType(this, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyValueVisitor<R, P> v,
-      ExtensibleMatchingRule value, P p) {
-    return v.visitExtensibleMatchingRuleType(this, value, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public int compare(ExtensibleMatchingRule o1, ExtensibleMatchingRule o2) {
-    return o1.getOID().compareToIgnoreCase(o2.getOID());
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public ExtensibleMatchingRule decodeValue(String value)
-      throws IllegalPropertyValueStringException {
-    ensureNotNull(value);
-
-    String name = value.trim().toLowerCase();
-    //Check if the name is a valid Matching rule OID or a Locale value.
-    ExtensibleMatchingRule rule =
-            DirectoryServer.getExtensibleMatchingRule(name);
-
-    if (rule == null) {
-      throw new IllegalPropertyValueStringException(this, value);
-    } else {
-      try {
-        validateValue(rule);
-        return rule;
-      } catch (IllegalPropertyValueException e) {
-        throw new IllegalPropertyValueStringException(this, value);
-      }
-    }
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public String encodeValue(ExtensibleMatchingRule value)
-      throws IllegalPropertyValueException {
-    return value.getNameOrOID();
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void validateValue(ExtensibleMatchingRule value)
-      throws IllegalPropertyValueException {
-    ensureNotNull(value);
-
-    // No implementation required.
-  }
-}
\ No newline at end of file
diff --git a/opendj-sdk/opends/src/server/org/opends/server/admin/PropertyDefinitionUsageBuilder.java b/opendj-sdk/opends/src/server/org/opends/server/admin/PropertyDefinitionUsageBuilder.java
index ee38963..ecb17af 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/admin/PropertyDefinitionUsageBuilder.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/admin/PropertyDefinitionUsageBuilder.java
@@ -338,17 +338,6 @@
      * {@inheritDoc}
      */
     @Override
-     public Message visitExtensibleMatchingRuleType(
-            ExtensibleMatchingRuleTypePropertyDefinition d, Void p) {
-        return Message.raw("LOCALE | OID");
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
     public <T> Message visitUnknown(PropertyDefinition<T> d, Void p)
         throws UnknownPropertyDefinitionException {
       return Message.raw("?");
diff --git a/opendj-sdk/opends/src/server/org/opends/server/admin/PropertyDefinitionVisitor.java b/opendj-sdk/opends/src/server/org/opends/server/admin/PropertyDefinitionVisitor.java
index 67ab9a9..5f0f9cb 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/admin/PropertyDefinitionVisitor.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/admin/PropertyDefinitionVisitor.java
@@ -268,22 +268,6 @@
 
 
 
- /**
-   * Visit an extensible matching rule property definition.
-   *
-   * @param pd
-   *          The string property definition to visit.
-   * @param p
-   *          A visitor specified parameter.
-   * @return Returns a visitor specified result.
-   */
-  public R visitExtensibleMatchingRuleType(
-          ExtensibleMatchingRuleTypePropertyDefinition pd, P p) {
-    return visitUnknown(pd, p);
-  }
-
-
-
 
   /**
    * Visit an unknown type of property definition. Implementations of
diff --git a/opendj-sdk/opends/src/server/org/opends/server/admin/PropertyValueVisitor.java b/opendj-sdk/opends/src/server/org/opends/server/admin/PropertyValueVisitor.java
index c7b42be..61b881e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/admin/PropertyValueVisitor.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/admin/PropertyValueVisitor.java
@@ -35,7 +35,6 @@
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.DN;
 import org.opends.server.authorization.dseecompat.Aci;
-import org.opends.server.api.ExtensibleMatchingRule;
 
 
 /**
@@ -309,25 +308,6 @@
 
 
   /**
-   * Visit an extensible matching rule type.
-   *
-   * @param pd
-   *          The extensible matching rule type property definition.
-   * @param v
-   *          The property value to visit.
-   * @param p
-   *          A visitor specified parameter.
-   * @return Returns a visitor specified result.
-   */
-  public R visitExtensibleMatchingRuleType(
-          ExtensibleMatchingRuleTypePropertyDefinition pd,
-          ExtensibleMatchingRule v, P p) {
-    return visitUnknown(pd, v, p);
-  }
-
-
-
-  /**
    * Visit an unknown type of property value. Implementations of this
    * method can provide default behavior for unknown types of
    * property.
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java
index aa08a28..dfcfa8e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java
@@ -47,6 +47,8 @@
 import org.opends.server.config.ConfigException;
 import static org.opends.messages.JebMessages.*;
 import static org.opends.server.util.ServerConstants.*;
+import static org.opends.server.loggers.ErrorLogger.*;
+import static org.opends.server.util.StaticUtils.toLowerCase;
 
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.util.StaticUtils;
@@ -250,7 +252,7 @@
     if (indexConfig.getIndexType().contains(
         LocalDBIndexCfgDefn.IndexType.EXTENSIBLE))
     {
-      Set<ExtensibleMatchingRule> extensibleRules =
+      Set<String> extensibleRules =
               indexConfig.getIndexExtensibleMatchingRule();
       if(extensibleRules == null || extensibleRules.size() == 0)
       {
@@ -264,8 +266,19 @@
       //indexer and index. A Collation substring matching rule is treated
       // differently as it uses a separate indexer and index.
       IndexConfig config = new JEIndexConfig(indexConfig.getSubstringLength());
-      for(ExtensibleMatchingRule rule:extensibleRules)
+      for(String ruleName:extensibleRules)
       {
+        ExtensibleMatchingRule rule =
+                DirectoryServer.getExtensibleMatchingRule(
+                                                    toLowerCase(ruleName));
+        if(rule == null)
+        {
+          Message message =
+                  ERR_CONFIG_INDEX_TYPE_NEEDS_VALID_MATCHING_RULE.get(
+                  String.valueOf(attrType),ruleName);
+          logError(message);
+          continue;
+        }
         Map<String,Index> indexMap = new HashMap<String,Index>();
         for(ExtensibleIndexer indexer : rule.getIndexers(config))
         {
@@ -1485,6 +1498,7 @@
    * Get a string representation of this object.
    * @return return A string representation of this object.
    */
+  @Override
   public String toString()
   {
     return getName();
@@ -1545,7 +1559,7 @@
     }
     if (cfg.getIndexType().contains(LocalDBIndexCfgDefn.IndexType.EXTENSIBLE))
     {
-      Set<ExtensibleMatchingRule> newRules =
+      Set<String> newRules =
               cfg.getIndexExtensibleMatchingRule();
       if (newRules == null || newRules.size() == 0)
       {
@@ -1895,15 +1909,29 @@
       if (cfg.getIndexType().contains(
               LocalDBIndexCfgDefn.IndexType.EXTENSIBLE))
       {
-        Set<ExtensibleMatchingRule> extensibleRules =
+        Set<String> extensibleRules =
             cfg.getIndexExtensibleMatchingRule();
+        Set<ExtensibleMatchingRule> validRules =
+                                      new HashSet<ExtensibleMatchingRule>();
         if(extensibleIndexes == null)
         {
           extensibleIndexes = new ExtensibleMatchingRuleIndex();
         }
         IndexConfig config = new JEIndexConfig(cfg.getSubstringLength());
-        for(ExtensibleMatchingRule rule:extensibleRules)
+        for(String ruleName:extensibleRules)
         {
+          ExtensibleMatchingRule rule =
+                  DirectoryServer.getExtensibleMatchingRule(
+                                            toLowerCase(ruleName));
+           if(rule == null)
+          {
+            Message message =
+                    ERR_CONFIG_INDEX_TYPE_NEEDS_VALID_MATCHING_RULE.get(
+                    String.valueOf(attrType),ruleName);
+            logError(message);
+            continue;
+          }
+          validRules.add(rule);
           Map<String,Index> indexMap = new HashMap<String,Index>();
           for(ExtensibleIndexer indexer: rule.getIndexers(config))
           {
@@ -1929,6 +1957,14 @@
                                         env,
                                         entryContainer);
               extensibleIndexes.addIndex(extensibleIndex,indexID);
+              extensibleIndex.open();
+
+              if(!extensibleIndex.isTrusted())
+              {
+                adminActionRequired = true;
+                messages.add(NOTE_JEB_INDEX_ADD_REQUIRES_REBUILD.get(
+                    extensibleIndex.getName()));
+              }
             }
             else
             {
@@ -1946,7 +1982,7 @@
               {
                 Indexer extensibleIndexer =
                       new JEExtensibleIndexer(attrType,
-                                                 rule,
+                                                  rule,
                                                  indexer);
                 extensibleIndex.setIndexer(extensibleIndexer);
               }
@@ -1963,7 +1999,7 @@
                 new HashSet<ExtensibleMatchingRule>();
         for(ExtensibleMatchingRule r:extensibleIndexes.getRules())
         {
-          if(!extensibleRules.contains(r))
+          if(!validRules.contains(r))
           {
             deletedRules.add(r);
           }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
index ed68cc0..4d9a025 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
@@ -1142,10 +1142,16 @@
           hasSubIndex = true;
           break;
         }
-        Set<ExtensibleMatchingRule> matchingRules =
+        Set<String> matchingRules =
                               indexCfg.getIndexExtensibleMatchingRule();
-        for(ExtensibleMatchingRule rule: matchingRules)
+        for(String ruleName: matchingRules)
         {
+          ExtensibleMatchingRule rule =
+                  DirectoryServer.getExtensibleMatchingRule(ruleName);
+          if(rule == null)
+          {
+            continue;
+          }
           for(ExtensibleIndexer indexer: rule.getIndexers(null))
           {
             String indexID = indexer.getExtensibleIndexID();

--
Gitblit v1.10.0