From a290c34a5ac2f5654f6f26f398459bf2d904bfb4 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Mon, 24 Mar 2014 16:22:58 +0000
Subject: [PATCH] OPENDJ-1308 Migrate schema support
---
opendj3-server-dev/src/server/org/opends/server/backends/jeb/AttributeIndex.java | 255 ++++++++++------------------
opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java | 10
opendj3-server-dev/src/server/org/opends/server/api/ExtensibleMatchingRule.java | 5
opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/schema/TimeBasedMatchingRuleFactoryTest.java | 3
opendj3-server-dev/src/server/org/opends/server/schema/CollationMatchingRuleFactory.java | 125 ++-----------
opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/schema/CollationMatchingRuleFactoryTest.java | 95 ++++++++++
opendj3-server-dev/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java | 3
opendj3-server-dev/src/server/org/opends/server/schema/TimeBasedMatchingRuleFactory.java | 6
8 files changed, 218 insertions(+), 284 deletions(-)
diff --git a/opendj3-server-dev/src/server/org/opends/server/api/ExtensibleMatchingRule.java b/opendj3-server-dev/src/server/org/opends/server/api/ExtensibleMatchingRule.java
index 4c2abe5..881553c 100644
--- a/opendj3-server-dev/src/server/org/opends/server/api/ExtensibleMatchingRule.java
+++ b/opendj3-server-dev/src/server/org/opends/server/api/ExtensibleMatchingRule.java
@@ -31,7 +31,6 @@
import org.forgerock.opendj.ldap.ByteSequence;
import org.forgerock.opendj.ldap.DecodeException;
import org.forgerock.opendj.ldap.spi.IndexQueryFactory;
-import org.forgerock.opendj.ldap.spi.IndexingOptions;
/**
* This interface defines the set of methods that must be
@@ -49,12 +48,10 @@
* Returns a collection of extensible indexers associated with this matching
* rule.
*
- * @param indexingOptions
- * The indexing options to be used by this matching rule.
* @return The collection of extensible indexers associated with this matching
* rule.
*/
- Collection<ExtensibleIndexer> getIndexers(IndexingOptions indexingOptions);
+ Collection<ExtensibleIndexer> getIndexers();
diff --git a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/AttributeIndex.java b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/AttributeIndex.java
index d9b9f34..cb1e32d 100644
--- a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/AttributeIndex.java
+++ b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/AttributeIndex.java
@@ -42,7 +42,10 @@
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.meta.LocalDBIndexCfgDefn;
import org.opends.server.admin.std.server.LocalDBIndexCfg;
-import org.opends.server.api.*;
+import org.opends.server.api.ExtensibleIndexer;
+import org.opends.server.api.ExtensibleMatchingRule;
+import org.opends.server.api.MatchingRule;
+import org.opends.server.api.SubstringMatchingRule;
import org.opends.server.core.DirectoryServer;
import org.opends.server.monitors.DatabaseEnvironmentMonitor;
import org.opends.server.types.*;
@@ -148,8 +151,7 @@
AttributeType attrType = indexConfig.getAttribute();
String name =
entryContainer.getDatabasePrefix() + "_" + attrType.getNameOrOID();
- int indexEntryLimit = indexConfig.getIndexEntryLimit();
- JEIndexConfig config = new JEIndexConfig(indexConfig.getSubstringLength());
+ final JEIndexConfig config = new JEIndexConfig(indexConfig.getSubstringLength());
if (indexConfig.getIndexType().contains(
LocalDBIndexCfgDefn.IndexType.EQUALITY))
@@ -161,15 +163,8 @@
if (indexConfig.getIndexType().contains(
LocalDBIndexCfgDefn.IndexType.PRESENCE))
{
- Indexer presenceIndexer = new PresenceIndexer(attrType);
- this.presenceIndex = new Index(name + ".presence",
- presenceIndexer,
- state,
- indexEntryLimit,
- cursorEntryLimit,
- false,
- env,
- entryContainer);
+ this.presenceIndex = newIndex(name + ".presence",
+ new PresenceIndexer(attrType), indexConfig.getIndexEntryLimit());
}
if (indexConfig.getIndexType().contains(
@@ -208,40 +203,27 @@
for(String ruleName:extensibleRules)
{
ExtensibleMatchingRule rule =
- DirectoryServer.getExtensibleMatchingRule(
- toLowerCase(ruleName));
+ DirectoryServer.getExtensibleMatchingRule(toLowerCase(ruleName));
if(rule == null)
{
logger.error(ERR_CONFIG_INDEX_TYPE_NEEDS_VALID_MATCHING_RULE, attrType, ruleName);
continue;
}
Map<String,Index> indexMap = new HashMap<String,Index>();
- for(ExtensibleIndexer indexer : rule.getIndexers(config))
+ for (ExtensibleIndexer indexer : rule.getIndexers())
{
String indexID = attrType.getNameOrOID() + "." + indexer.getIndexID();
if(!extensibleIndexes.isIndexPresent(indexID))
{
//There is no index available for this index id. Create a new index.
- Indexer extensibleIndexer =
- new JEExtensibleIndexer(attrType,
- rule,
- indexer);
- String indexName = entryContainer.getDatabasePrefix() + "_"
- + indexID;
- Index extensibleIndex = new Index(indexName,
- extensibleIndexer,
- state,
- indexEntryLimit,
- cursorEntryLimit,
- false,
- env,
- entryContainer);
- extensibleIndexes.addIndex(extensibleIndex,indexID);
+ String indexName = entryContainer.getDatabasePrefix() + "_" + indexID;
+ Index extIndex = newExtensibleIndex(indexName, attrType, indexer);
+ extensibleIndexes.addIndex(extIndex, indexID);
}
- extensibleIndexes.addRule(indexID, rule);
- indexMap.put(indexer.getExtensibleIndexID(),
- extensibleIndexes.getIndex(indexID));
- }
+ extensibleIndexes.addRule(indexID, rule);
+ indexMap.put(indexer.getExtensibleIndexID(),
+ extensibleIndexes.getIndex(indexID));
+ }
IndexQueryFactory<IndexQuery> factory =
new IndexQueryFactoryImpl(indexMap, config);
extensibleIndexes.addQueryFactory(rule, factory);
@@ -249,6 +231,13 @@
}
}
+ private Index newIndex(String indexName, Indexer indexer,
+ int indexEntryLimit)
+ {
+ return new Index(indexName, indexer, state, indexEntryLimit,
+ cursorEntryLimit, false, env, entryContainer);
+ }
+
private Index buildExtIndex(String name, AttributeType attrType,
MatchingRule rule, ExtensibleIndexer extIndexer) throws ConfigException
{
@@ -258,15 +247,15 @@
attrType, extIndexer.getExtensibleIndexID()));
}
- Indexer indexer = new JEExtensibleIndexer(attrType, rule, extIndexer);
- return new Index(name + "." + extIndexer.getExtensibleIndexID(),
- indexer,
- state,
- indexConfig.getIndexEntryLimit(),
- cursorEntryLimit,
- false,
- env,
- entryContainer);
+ final String indexName = name + "." + extIndexer.getExtensibleIndexID();
+ return newExtensibleIndex(indexName, attrType, extIndexer);
+ }
+
+ private Index newExtensibleIndex(String indexName, AttributeType attrType,
+ ExtensibleIndexer extIndexer)
+ {
+ return newIndex(indexName, new JEExtensibleIndexer(attrType, extIndexer),
+ indexConfig.getIndexEntryLimit());
}
/**
@@ -1536,10 +1525,7 @@
if(extensibleIndexes!=null)
{
- for(Index extensibleIndex:extensibleIndexes.getIndexes())
- {
- dbList.add(extensibleIndex);
- }
+ dbList.addAll(extensibleIndexes.getIndexes());
}
}
@@ -1625,16 +1611,15 @@
AttributeType attrType = cfg.getAttribute();
String name =
entryContainer.getDatabasePrefix() + "_" + attrType.getNameOrOID();
- int indexEntryLimit = cfg.getIndexEntryLimit();
- JEIndexConfig config = new JEIndexConfig(cfg.getSubstringLength());
+ final int indexEntryLimit = cfg.getIndexEntryLimit();
+ final JEIndexConfig config = new JEIndexConfig(cfg.getSubstringLength());
if (cfg.getIndexType().contains(LocalDBIndexCfgDefn.IndexType.EQUALITY))
{
if (equalityIndex == null)
{
- EqualityIndexer indexer = new EqualityIndexer(attrType);
- Indexer extIndexer = new JEExtensibleIndexer(attrType, attrType.getEqualityMatchingRule(), indexer);
- equalityIndex = openNewIndex(name, extIndexer, indexer, adminActionRequired, messages);
+ equalityIndex = openNewIndex(name, attrType,
+ new EqualityIndexer(attrType), adminActionRequired, messages);
}
else
{
@@ -1642,10 +1627,8 @@
if(this.equalityIndex.setIndexEntryLimit(indexEntryLimit))
{
adminActionRequired.set(true);
- LocalizableMessage message =
- NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD.get(
- equalityIndex.getName());
- messages.add(message);
+ messages.add(NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD
+ .get(equalityIndex.getName()));
this.equalityIndex.setIndexEntryLimit(indexEntryLimit);
}
}
@@ -1672,22 +1655,8 @@
if(presenceIndex == null)
{
Indexer presenceIndexer = new PresenceIndexer(attrType);
- presenceIndex = new Index(name + ".presence",
- presenceIndexer,
- state,
- indexEntryLimit,
- cursorEntryLimit,
- false,
- env,
- entryContainer);
- presenceIndex.open();
-
- if(!presenceIndex.isTrusted())
- {
- adminActionRequired.set(true);
- messages.add(NOTE_JEB_INDEX_ADD_REQUIRES_REBUILD.get(
- presenceIndex.getName()));
- }
+ presenceIndex = newIndex(name + ".presence", presenceIndexer, indexEntryLimit);
+ openIndex(presenceIndex, adminActionRequired, messages);
}
else
{
@@ -1695,10 +1664,8 @@
if(this.presenceIndex.setIndexEntryLimit(indexEntryLimit))
{
adminActionRequired.set(true);
- LocalizableMessage message =
- NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD.get(
- presenceIndex.getName());
- messages.add(message);
+ messages.add(NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD
+ .get(presenceIndex.getName()));
}
}
}
@@ -1722,10 +1689,12 @@
if (cfg.getIndexType().contains(LocalDBIndexCfgDefn.IndexType.SUBSTRING))
{
SubstringIndexer indexer = new SubstringIndexer(attrType, config);
- Indexer extIndexer = new JEExtensibleIndexer(attrType, attrType.getSubstringMatchingRule(), indexer);
+ Indexer extIndexer = new JEExtensibleIndexer(attrType, indexer);
if(substringIndex == null)
{
- substringIndex = openNewIndex(name, extIndexer, indexer, adminActionRequired, messages);
+ Index index = newIndex(name + "." + indexer.getExtensibleIndexID(),
+ extIndexer, indexEntryLimit);
+ substringIndex = openIndex(index, adminActionRequired, messages);
}
else
{
@@ -1733,10 +1702,8 @@
if(this.substringIndex.setIndexEntryLimit(indexEntryLimit))
{
adminActionRequired.set(true);
- LocalizableMessage message =
- NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD.get(
- substringIndex.getName());
- messages.add(message);
+ messages.add(NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD
+ .get(substringIndex.getName()));
}
if (indexConfig.getSubstringLength() != cfg.getSubstringLength())
@@ -1766,9 +1733,8 @@
{
if(orderingIndex == null)
{
- OrderingIndexer indexer = new OrderingIndexer(attrType);
- Indexer extIndexer = new JEExtensibleIndexer(attrType, attrType.getOrderingMatchingRule(), indexer);
- orderingIndex = openNewIndex(name, extIndexer, indexer, adminActionRequired, messages);
+ orderingIndex = openNewIndex(name, attrType,
+ new OrderingIndexer(attrType), adminActionRequired, messages);
}
else
{
@@ -1776,10 +1742,8 @@
if(this.orderingIndex.setIndexEntryLimit(indexEntryLimit))
{
adminActionRequired.set(true);
- LocalizableMessage message =
- NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD.get(
- orderingIndex.getName());
- messages.add(message);
+ messages.add(NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD
+ .get(orderingIndex.getName()));
}
}
}
@@ -1805,9 +1769,8 @@
{
if(approximateIndex == null)
{
- ApproximateIndexer indexer = new ApproximateIndexer(attrType);
- Indexer extIndexer = new JEExtensibleIndexer(attrType, attrType.getApproximateMatchingRule(), indexer);
- approximateIndex = openNewIndex(name, extIndexer, indexer, adminActionRequired, messages);
+ approximateIndex = openNewIndex(name, attrType,
+ new ApproximateIndexer(attrType), adminActionRequired, messages);
}
else
{
@@ -1815,10 +1778,8 @@
if(this.approximateIndex.setIndexEntryLimit(indexEntryLimit))
{
adminActionRequired.set(true);
- LocalizableMessage message =
- NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD.get(
- approximateIndex.getName());
- messages.add(message);
+ messages.add(NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD
+ .get(approximateIndex.getName()));
}
}
}
@@ -1853,8 +1814,7 @@
for(String ruleName:extensibleRules)
{
ExtensibleMatchingRule rule =
- DirectoryServer.getExtensibleMatchingRule(
- toLowerCase(ruleName));
+ DirectoryServer.getExtensibleMatchingRule(toLowerCase(ruleName));
if(rule == null)
{
logger.error(ERR_CONFIG_INDEX_TYPE_NEEDS_VALID_MATCHING_RULE, attrType, ruleName);
@@ -1862,34 +1822,15 @@
}
validRules.add(rule);
Map<String,Index> indexMap = new HashMap<String,Index>();
- for(ExtensibleIndexer indexer: rule.getIndexers(config))
+ for (ExtensibleIndexer indexer : rule.getIndexers())
{
String indexID = attrType.getNameOrOID() + "." + indexer.getIndexID();
if(!extensibleIndexes.isIndexPresent(indexID))
{
- Indexer extensibleIndexer =
- new JEExtensibleIndexer(attrType,
- rule,
- indexer);
- String indexName = entryContainer.getDatabasePrefix() + "_"
- + indexID;
- Index extensibleIndex = new Index(indexName,
- extensibleIndexer,
- state,
- indexEntryLimit,
- cursorEntryLimit,
- false,
- env,
- entryContainer);
- extensibleIndexes.addIndex(extensibleIndex,indexID);
- extensibleIndex.open();
-
- if(!extensibleIndex.isTrusted())
- {
- adminActionRequired.set(true);
- messages.add(NOTE_JEB_INDEX_ADD_REQUIRES_REBUILD.get(
- extensibleIndex.getName()));
- }
+ String indexName = entryContainer.getDatabasePrefix() + "_" + indexID;
+ Index extIndex = newExtensibleIndex(indexName, attrType, indexer);
+ extensibleIndexes.addIndex(extIndex,indexID);
+ openIndex(extIndex, adminActionRequired, messages);
}
else
{
@@ -1897,38 +1838,26 @@
if(extensibleIndex.setIndexEntryLimit(indexEntryLimit))
{
adminActionRequired.set(true);
- LocalizableMessage message =
- NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD.get(
- extensibleIndex.getName());
- messages.add(message);
+ messages.add(NOTE_JEB_CONFIG_INDEX_ENTRY_LIMIT_REQUIRES_REBUILD
+ .get(extensibleIndex.getName()));
}
- if(indexConfig.getSubstringLength() !=
- cfg.getSubstringLength())
+ if (indexConfig.getSubstringLength() != cfg.getSubstringLength())
{
- Indexer extensibleIndexer =
- new JEExtensibleIndexer(attrType,
- rule,
- indexer);
- extensibleIndex.setIndexer(extensibleIndexer);
+ extensibleIndex.setIndexer(
+ new JEExtensibleIndexer(attrType, indexer));
}
}
extensibleIndexes.addRule(indexID, rule);
indexMap.put(indexer.getExtensibleIndexID(), extensibleIndexes.getIndex(indexID));
}
- IndexQueryFactory<IndexQuery> factory =
+ final IndexQueryFactory<IndexQuery> factory =
new IndexQueryFactoryImpl(indexMap, config);
extensibleIndexes.addQueryFactory(rule, factory);
}
//Some rules might have been removed from the configuration.
Set<ExtensibleMatchingRule> deletedRules =
- new HashSet<ExtensibleMatchingRule>();
- for(ExtensibleMatchingRule r:extensibleIndexes.getRules())
- {
- if(!validRules.contains(r))
- {
- deletedRules.add(r);
- }
- }
+ new HashSet<ExtensibleMatchingRule>(extensibleIndexes.getRules());
+ deletedRules.removeAll(validRules);
if(deletedRules.size() > 0)
{
entryContainer.exclusiveLock.lock();
@@ -1939,7 +1868,7 @@
Set<ExtensibleMatchingRule> rules =
new HashSet<ExtensibleMatchingRule>();
List<String> ids = new ArrayList<String>();
- for(ExtensibleIndexer indexer: rule.getIndexers(config))
+ for (ExtensibleIndexer indexer : rule.getIndexers())
{
String id = attrType.getNameOrOID() + "." + indexer.getIndexID();
rules.addAll(extensibleIndexes.getRules(id));
@@ -1950,8 +1879,7 @@
//Rule has been already deleted.
continue;
}
- //If all the rules are part of the deletedRules, delete
- //this index.
+ //If all the rules are part of the deletedRules, delete this index
if(deletedRules.containsAll(rules))
{
//it is safe to delete this index as it is not shared.
@@ -1959,7 +1887,6 @@
{
Index extensibleIndex = extensibleIndexes.getIndex(indexID);
entryContainer.deleteDatabase(extensibleIndex);
- extensibleIndex = null;
extensibleIndexes.deleteIndex(indexID);
extensibleIndexes.deleteRule(indexID);
}
@@ -1989,7 +1916,6 @@
for(Index extensibleIndex:extensibleIndexes.getIndexes())
{
entryContainer.deleteDatabase(extensibleIndex);
- extensibleIndex = null;
}
extensibleIndexes.deleteAll();
}
@@ -2013,19 +1939,24 @@
}
}
- private Index openNewIndex(String name, Indexer indexer, ExtensibleIndexer extIndexer,
- AtomicBoolean adminActionRequired, ArrayList<LocalizableMessage> messages)
+ private Index openNewIndex(String name, AttributeType attrType,
+ ExtensibleIndexer indexer, AtomicBoolean adminActionRequired,
+ ArrayList<LocalizableMessage> messages)
{
- Index index = new Index(name + "." + extIndexer.getExtensibleIndexID(), indexer,
- state, indexConfig.getIndexEntryLimit(), cursorEntryLimit, false, env,
- entryContainer);
+ String indexName = name + "." + indexer.getExtensibleIndexID();
+ Index index = newExtensibleIndex(indexName, attrType, indexer);
+ return openIndex(index, adminActionRequired, messages);
+ }
+
+ private Index openIndex(Index index, AtomicBoolean adminActionRequired,
+ ArrayList<LocalizableMessage> messages)
+ {
index.open();
if (!index.isTrusted())
{
adminActionRequired.set(true);
- messages.add(NOTE_JEB_INDEX_ADD_REQUIRES_REBUILD.get(index
- .getName()));
+ messages.add(NOTE_JEB_INDEX_ADD_REQUIRES_REBUILD.get(index.getName()));
}
return index;
}
@@ -2334,9 +2265,7 @@
if(debugBuffer != null)
{
debugBuffer.append("[INDEX:");
- JEIndexConfig config =
- new JEIndexConfig(indexConfig.getSubstringLength());
- for(ExtensibleIndexer indexer : rule.getIndexers(config))
+ for (ExtensibleIndexer indexer : rule.getIndexers())
{
debugBuffer.append(" ")
.append(extensibleFilter.getAttributeType().getNameOrOID())
@@ -2426,18 +2355,14 @@
* @return A Set of extensible matching rules corresponding to
* an index ID.
*/
- private Set<ExtensibleMatchingRule>
- getRules(String indexID)
+ private Set<ExtensibleMatchingRule> getRules(String indexID)
{
Set<ExtensibleMatchingRule> rules = id2RulesMap.get(indexID);
- if(rules == null)
+ if (rules != null)
{
- return Collections.emptySet();
+ return Collections.unmodifiableSet(rules);
}
- else
- {
- return Collections.unmodifiableSet(id2RulesMap.get(indexID));
- }
+ return Collections.emptySet();
}
/**
diff --git a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java
index 5d4c381..88d0d34 100644
--- a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java
+++ b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java
@@ -35,7 +35,6 @@
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.DecodeException;
import org.opends.server.api.ExtensibleIndexer;
-import org.opends.server.api.MatchingRule;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeType;
import org.opends.server.types.Entry;
@@ -69,11 +68,9 @@
*
* @param attributeType The attribute type for which an indexer is
* required.
- * @param matchingRule The extensible matching rule to be indexed.
* @param extensibleIndexer The extensible indexer to be used.
*/
public JEExtensibleIndexer(AttributeType attributeType,
- MatchingRule matchingRule,
ExtensibleIndexer extensibleIndexer)
{
this.attributeType = attributeType;
diff --git a/opendj3-server-dev/src/server/org/opends/server/schema/CollationMatchingRuleFactory.java b/opendj3-server-dev/src/server/org/opends/server/schema/CollationMatchingRuleFactory.java
index 7eb2d85..f154519 100644
--- a/opendj3-server-dev/src/server/org/opends/server/schema/CollationMatchingRuleFactory.java
+++ b/opendj3-server-dev/src/server/org/opends/server/schema/CollationMatchingRuleFactory.java
@@ -85,19 +85,15 @@
private boolean substringMatchingRuleType;
// Stores the list of available locales on this JVM.
- private static final Set<Locale> supportedLocales;
+ private static final Set<Locale> supportedLocales = new HashSet<Locale>(
+ Arrays.asList(Locale.getAvailableLocales()));
// Current Configuration.
private CollationMatchingRuleCfg currentConfig;
// Map of OID and the Matching Rule.
- private final Map<String, MatchingRule> matchingRules;
-
- static
- {
- supportedLocales = new HashSet<Locale>();
- supportedLocales.addAll(Arrays.asList(Locale.getAvailableLocales()));
- }
+ private final Map<String, MatchingRule> matchingRules =
+ new HashMap<String, MatchingRule>();
@@ -106,8 +102,7 @@
*/
public CollationMatchingRuleFactory()
{
- // Initialize the matchingRules.
- matchingRules = new HashMap<String, MatchingRule>();
+ super();
}
@@ -131,8 +126,7 @@
* @param matchingRule
* instance of a MatchingRule.
*/
- private void addMatchingRule(String oid,
- MatchingRule matchingRule)
+ private void addMatchingRule(String oid, MatchingRule matchingRule)
{
matchingRules.put(oid, matchingRule);
}
@@ -169,8 +163,7 @@
* @param ruleTypes
* The Set containing allowed matching rule types.
*/
- private void initializeMatchingRuleTypes(
- SortedSet<MatchingRuleType> ruleTypes)
+ private void initializeMatchingRuleTypes(SortedSet<MatchingRuleType> ruleTypes)
{
for (MatchingRuleType type : ruleTypes)
{
@@ -223,9 +216,8 @@
* {@inheritDoc}
*/
@Override
- public void initializeMatchingRule(
- CollationMatchingRuleCfg configuration) throws ConfigException,
- InitializationException
+ public void initializeMatchingRule(CollationMatchingRuleCfg configuration)
+ throws ConfigException, InitializationException
{
initializeMatchingRuleTypes(configuration.getMatchingRuleType());
for (String collation : configuration.getCollation())
@@ -298,8 +290,7 @@
// 2. There is a change in the enable status
// i.e. (disable->enable or enable->disable). In this case, the
// ConfigManager will have already created the new Factory object.
- return new ConfigChangeResult(resultCode, adminActionRequired,
- messages);
+ return new ConfigChangeResult(resultCode, adminActionRequired, messages);
}
// Since we have come here it means that this Factory is enabled and
@@ -317,6 +308,7 @@
initializeMatchingRuleTypes(configuration.getMatchingRuleType());
for (String collation : configuration.getCollation())
{
+ // validation has already been performed in isConfigurationChangeAcceptable()
CollationMapper mapper = new CollationMapper(collation);
String languageTag = mapper.getLanguageTag();
Locale locale = getLocale(languageTag);
@@ -343,8 +335,7 @@
messages.add(message);
}
currentConfig = configuration;
- return new ConfigChangeResult(resultCode, adminActionRequired,
- messages);
+ return new ConfigChangeResult(resultCode, adminActionRequired, messages);
}
@@ -423,8 +414,7 @@
* @param locale
* Locale value
*/
- private void createLessThanMatchingRule(CollationMapper mapper,
- Locale locale)
+ private void createLessThanMatchingRule(CollationMapper mapper, Locale locale)
{
if (!lessThanMatchingRuleType) return;
@@ -477,8 +467,7 @@
* @param locale
* Locale value
*/
- private void createEqualityMatchingRule(CollationMapper mapper,
- Locale locale)
+ private void createEqualityMatchingRule(CollationMapper mapper, Locale locale)
{
if (!equalityMatchingRuleType)
{
@@ -907,8 +896,7 @@
* {@inheritDoc}
*/
@Override
- public Collection<ExtensibleIndexer> getIndexers(
- IndexingOptions indexingOptions)
+ public Collection<ExtensibleIndexer> getIndexers()
{
if (indexer == null)
{
@@ -1293,8 +1281,7 @@
// Normalize the Values in the following format:
// initialLength, initial, numberofany, anyLength1, any1,
- // anyLength2, any2, ..., anyLengthn, anyn, finalLength,
- // final
+ // anyLength2, any2, ..., anyLengthn, anyn, finalLength, final
List<Integer> normalizedList = new ArrayList<Integer>();
if (subInitial == null)
@@ -1335,7 +1322,6 @@
{
normalizedBytes[i] = normalizedList.get(i).byteValue();
}
-
return ByteString.wrap(normalizedBytes);
}
@@ -1470,28 +1456,13 @@
* {@inheritDoc}
*/
@Override
- public final Collection<ExtensibleIndexer> getIndexers(
- IndexingOptions indexingOptions)
+ public final Collection<ExtensibleIndexer> getIndexers()
{
- Collection<ExtensibleIndexer> indexers =
- new ArrayList<ExtensibleIndexer>();
- int substrLength = 6; // Default substring length;
+ List<ExtensibleIndexer> indexers = new ArrayList<ExtensibleIndexer>();
if (subIndexer == null)
{
- if (indexingOptions != null)
- {
- substrLength = indexingOptions.substringKeySize();
- }
- subIndexer =
- new CollationSubstringExtensibleIndexer(this, substrLength);
+ subIndexer = new CollationSubstringExtensibleIndexer(this);
}
- else if (indexingOptions != null
- && indexingOptions.substringKeySize() != subIndexer
- .getSubstringLength())
- {
- subIndexer.setSubstringLength(substrLength);
- }
-
if (indexer == null)
{
indexer = new CollationSharedExtensibleIndexer(this);
@@ -1578,11 +1549,10 @@
* The length of the substring.
* @return The candidate entry IDs.
*/
- private <T> T matchSubstring(String value,
- IndexQueryFactory<T> factory)
+ private <T> T matchSubstring(String value, IndexQueryFactory<T> factory)
{ // FIXME Code similar to
// AbstractSubstringMatchingRuleImpl.DefaultSubstringAssertion.substringMatch()
- int substrLength = subIndexer.getSubstringLength();
+ int substrLength = factory.getIndexingOptions().substringKeySize();
if (value.length() < substrLength)
{
return createRangeMatchQuery(value, factory, subIndexer);
@@ -1629,8 +1599,7 @@
if (subInitial != null)
{
// Always use the shared indexer for initial match.
- T query = matchInitialSubstring(subInitial, factory);
- queries.add(query);
+ queries.add(matchInitialSubstring(subInitial, factory));
}
if (subAny != null && subAny.size() > 0)
@@ -2030,40 +1999,27 @@
private final class CollationSubstringExtensibleIndexer extends
ExtensibleIndexer
{
- // The CollationSubstringMatching Rule.
private final CollationSubstringMatchingRule matchingRule;
- // The substring length.
- private int substringLen;
-
-
-
/**
* Creates a new instance of CollationSubstringExtensibleIndexer.
*
* @param matchingRule
* The CollationSubstringMatching Rule.
- * @param substringLen
- * The substring length.
*/
private CollationSubstringExtensibleIndexer(
- CollationSubstringMatchingRule matchingRule, int substringLen)
+ CollationSubstringMatchingRule matchingRule)
{
this.matchingRule = matchingRule;
- this.substringLen = substringLen;
}
-
-
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public void createKeys(Schema schema, ByteSequence value,
IndexingOptions options, Collection<ByteString> keys)
{ // TODO merge with AbstractSubstringMatchingRuleImpl.SubstringIndexer.createKeys();
String normValue = value.toString();
- int keyLength = substringLen;
+ int keyLength = options.substringKeySize();
for (int i = 0, remain = normValue.length(); remain > 0; i++, remain--)
{
int len = Math.min(keyLength, remain);
@@ -2078,42 +2034,13 @@
return matchingRule.getIndexName() + "." + getExtensibleIndexID();
}
-
-
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public String getExtensibleIndexID()
{
return EXTENSIBLE_INDEXER_ID_SUBSTRING;
}
-
-
- /**
- * Returns the substring length.
- *
- * @return The length of the substring.
- */
- private int getSubstringLength()
- {// TODO JNR remove
- return substringLen;
- }
-
-
-
- /**
- * Sets the substring length.
- *
- * @param substringLen
- * The substring length.
- */
- private void setSubstringLength(int substringLen)
- {// TODO JNR remove
- this.substringLen = substringLen;
- }
-
}
/**
diff --git a/opendj3-server-dev/src/server/org/opends/server/schema/TimeBasedMatchingRuleFactory.java b/opendj3-server-dev/src/server/org/opends/server/schema/TimeBasedMatchingRuleFactory.java
index 87033b3..428dd7c 100644
--- a/opendj3-server-dev/src/server/org/opends/server/schema/TimeBasedMatchingRuleFactory.java
+++ b/opendj3-server-dev/src/server/org/opends/server/schema/TimeBasedMatchingRuleFactory.java
@@ -323,8 +323,7 @@
/** {@inheritDoc} */
@Override
- public Collection<ExtensibleIndexer> getIndexers(
- IndexingOptions indexingOptions)
+ public Collection<ExtensibleIndexer> getIndexers()
{
if(indexer == null)
{
@@ -891,8 +890,7 @@
/** {@inheritDoc} */
@Override
- public Collection<ExtensibleIndexer> getIndexers(
- IndexingOptions indexingOptions)
+ public Collection<ExtensibleIndexer> getIndexers()
{
if(indexer == null)
{
diff --git a/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java b/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java
index 4084f5d..3cff6ed 100644
--- a/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java
+++ b/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java
@@ -38,7 +38,6 @@
import org.opends.server.admin.server.AdminTestCaseUtils;
import org.opends.server.admin.std.meta.LocalDBBackendCfgDefn;
import org.opends.server.admin.std.server.LocalDBBackendCfg;
-import org.opends.server.api.ExtensibleIndexer;
import org.opends.server.controls.SubtreeDeleteControl;
import org.opends.server.core.DeleteOperationBasis;
import org.opends.server.core.DirectoryServer;
@@ -870,15 +869,13 @@
private Indexer newOrderingIndexer(AttributeIndex index)
{
AttributeType attrType = index.getAttributeType();
- ExtensibleIndexer extIndexer = new OrderingIndexer(index.getAttributeType());
- return new JEExtensibleIndexer(attrType, attrType.getSubstringMatchingRule(), extIndexer);
+ return new JEExtensibleIndexer(attrType, new OrderingIndexer(attrType));
}
private Indexer newEqualityIndexer(AttributeIndex index)
{
AttributeType attrType = index.getAttributeType();
- ExtensibleIndexer extIndexer = new EqualityIndexer(index.getAttributeType());
- return new JEExtensibleIndexer(attrType, attrType.getSubstringMatchingRule(), extIndexer);
+ return new JEExtensibleIndexer(attrType, new EqualityIndexer(attrType));
}
private Indexer newSubstringIndexer(AttributeIndex index)
@@ -887,8 +884,7 @@
when(options.substringKeySize()).thenReturn(
index.getConfiguration().getSubstringLength());
AttributeType attrType = index.getAttributeType();
- ExtensibleIndexer extIndexer = new SubstringIndexer(attrType, options);
- return new JEExtensibleIndexer(attrType, attrType.getSubstringMatchingRule(), extIndexer);
+ return new JEExtensibleIndexer(attrType, new SubstringIndexer(attrType, options));
}
private void assertIndexContainsID(Indexer indexer, Entry entry, Index index,
diff --git a/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/schema/CollationMatchingRuleFactoryTest.java b/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/schema/CollationMatchingRuleFactoryTest.java
new file mode 100644
index 0000000..41d321f
--- /dev/null
+++ b/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/schema/CollationMatchingRuleFactoryTest.java
@@ -0,0 +1,95 @@
+/*
+ * 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 legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * 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 legal-notices/CDDLv1_0.txt.
+ * 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 2014 ForgeRock AS
+ */
+package org.opends.server.schema;
+
+import java.util.*;
+
+import org.forgerock.opendj.config.server.ConfigException;
+import org.opends.server.admin.std.meta.CollationMatchingRuleCfgDefn.MatchingRuleType;
+import org.opends.server.admin.std.server.CollationMatchingRuleCfg;
+import org.opends.server.api.MatchingRule;
+import org.opends.server.types.InitializationException;
+import org.testng.annotations.Test;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+@SuppressWarnings("javadoc")
+public class CollationMatchingRuleFactoryTest extends SchemaTestCase
+{
+
+ @Test
+ public void testMatchingRulesBuilding() throws Exception
+ {
+ final List<String> allRuleNames = new ArrayList<String>();
+ final Collection<MatchingRule> mRules =
+ getMatchingRules("fr:1.3.6.1.4.1.42.2.27.9.4.76.1");
+ for (MatchingRule rule : mRules)
+ {
+ allRuleNames.addAll(rule.getNames());
+ }
+ assertThat(allRuleNames).containsOnly("fr",
+ "fr.1", "fr.lt", "fr.2", "fr.lte",
+ "fr.3", "fr.eq",
+ "fr.4", "fr.gte", "fr.5", "fr.gt",
+ "fr.6", "fr.sub");
+ }
+
+ @Test
+ public void testRecursiveMatchingRulesBuilding() throws Exception
+ {
+ final List<String> allRuleNames = new ArrayList<String>();
+ final Collection<MatchingRule> mRules =
+ getMatchingRules("fr-FR:1.3.6.1.4.1.42.2.27.9.4.76.1");
+ for (MatchingRule rule : mRules)
+ {
+ allRuleNames.addAll(rule.getNames());
+ }
+ assertThat(allRuleNames).containsOnly("fr-FR",
+ "fr-FR.1", "fr-FR.lt", "fr-FR.2", "fr-FR.lte",
+ "fr-FR.3", "fr-FR.eq",
+ "fr-FR.4", "fr-FR.gte", "fr-FR.5", "fr-FR.gt",
+ "fr-FR.6", "fr-FR.sub");
+ }
+
+ private Collection<MatchingRule> getMatchingRules(String collationOID)
+ throws ConfigException, InitializationException
+ {
+ final CollationMatchingRuleFactory factory =
+ new CollationMatchingRuleFactory();
+ final CollationMatchingRuleCfg cfg = mock(CollationMatchingRuleCfg.class);
+ when(cfg.getMatchingRuleType()).thenReturn(
+ toSortedSet(EnumSet.allOf(MatchingRuleType.class)));
+ when(cfg.getCollation()).thenReturn(
+ toSortedSet(Collections.singleton(collationOID)));
+ factory.initializeMatchingRule(cfg);
+ return factory.getMatchingRules();
+ }
+
+ private <T> SortedSet<T> toSortedSet(Set<T> set)
+ {
+ return new TreeSet<T>(set);
+ }
+}
diff --git a/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/schema/TimeBasedMatchingRuleFactoryTest.java b/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/schema/TimeBasedMatchingRuleFactoryTest.java
index b68e5a7..88cc22d 100644
--- a/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/schema/TimeBasedMatchingRuleFactoryTest.java
+++ b/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/schema/TimeBasedMatchingRuleFactoryTest.java
@@ -31,7 +31,6 @@
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ConditionResult;
import org.forgerock.opendj.ldap.DecodeException;
-import org.opends.server.admin.std.server.CollationMatchingRuleCfg;
import org.opends.server.admin.std.server.MatchingRuleCfg;
import org.opends.server.api.MatchingRule;
import org.opends.server.util.TimeThread;
@@ -225,7 +224,7 @@
{
final TimeBasedMatchingRuleFactory factory =
new TimeBasedMatchingRuleFactory();
- final MatchingRuleCfg cfg = mock(CollationMatchingRuleCfg.class);
+ final MatchingRuleCfg cfg = mock(MatchingRuleCfg.class);
factory.initializeMatchingRule(cfg);
final Collection<MatchingRule> mRules = factory.getMatchingRules();
verifyNoMoreInteractions(cfg);
--
Gitblit v1.10.0