From 0ea193c303a1553fbde5a1637d40bfb46c8e5b73 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Fri, 16 Sep 2016 12:49:16 +0000
Subject: [PATCH] OPENDJ-3302 Do not replicate changes in schema elements related to configuration
---
opendj-server-legacy/src/main/java/org/opends/server/util/SchemaUtils.java | 21 ++++++++++
opendj-server-legacy/src/main/java/org/opends/server/schema/SchemaFilesWriter.java | 28 +++++++++++++
opendj-server-legacy/src/main/java/org/opends/server/schema/SchemaHandler.java | 12 +----
3 files changed, 50 insertions(+), 11 deletions(-)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/schema/SchemaFilesWriter.java b/opendj-server-legacy/src/main/java/org/opends/server/schema/SchemaFilesWriter.java
index 3c7c0c0..77491e1 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/schema/SchemaFilesWriter.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/schema/SchemaFilesWriter.java
@@ -16,6 +16,9 @@
*/
package org.opends.server.schema;
+import static org.opends.server.util.SchemaUtils.is02ConfigLdif;
+
+import static org.opends.server.util.SchemaUtils.parseSchemaFileFromElementDefinition;
import static org.forgerock.opendj.ldap.ModificationType.ADD;
import static org.forgerock.opendj.ldap.ModificationType.DELETE;
import static org.forgerock.opendj.ldap.schema.CoreSchema.*;
@@ -228,7 +231,7 @@
// so we don't re-find these same changes on the next startup.
writeConcatenatedSchema();
}
- return mods;
+ return filterOutConfigSchemaElementFromModifications(mods);
}
catch (InitializationException ie)
{
@@ -243,6 +246,29 @@
}
}
+ private List<Modification> filterOutConfigSchemaElementFromModifications(final List<Modification> mods)
+ throws DirectoryException
+ {
+ final List<Modification> filteredMods = new ArrayList<>();
+ for (Modification modification : mods)
+ {
+ for (ByteString v : modification.getAttribute())
+ {
+ String definition = v.toString();
+ if (!isFrom02ConfigLdif(definition))
+ {
+ filteredMods.add(modification);
+ }
+ }
+ }
+ return filteredMods;
+ }
+
+ private boolean isFrom02ConfigLdif(String definition) throws DirectoryException
+ {
+ return is02ConfigLdif(parseSchemaFileFromElementDefinition(definition));
+ }
+
/**
* Writes a single file containing all schema element definitions, which can be used on startup to
* determine whether the schema files were edited with the server offline.
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/schema/SchemaHandler.java b/opendj-server-legacy/src/main/java/org/opends/server/schema/SchemaHandler.java
index 21603a1..354cf36 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/schema/SchemaHandler.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/schema/SchemaHandler.java
@@ -15,6 +15,8 @@
*/
package org.opends.server.schema;
+import static org.opends.server.util.SchemaUtils.is02ConfigLdif;
+
import static java.util.Collections.emptyList;
import static org.opends.messages.ConfigMessages.*;
import static org.opends.messages.SchemaMessages.*;
@@ -109,7 +111,6 @@
private static final String CORE_SCHEMA_PROVIDER_NAME = "Core Schema";
private static final String CORE_SCHEMA_FILE = "00-core.ldif";
private static final String RFC_3112_SCHEMA_FILE = "03-rfc3112.ldif";
- private static final String CONFIG_SCHEMA_ELEMENTS_FILE = "02-config.ldif";
private static final String CORE_SCHEMA_ELEMENTS_FILE = "00-core.ldif";
private static final AttributeType attributeTypesType = CoreSchema.getAttributeTypesAttributeType();
@@ -569,10 +570,8 @@
{
String definition = v.toString();
String schemaFile = SchemaUtils.parseSchemaFileFromElementDefinition(definition);
- if (is02ConfigLdif(schemaFile))
+ if (SchemaUtils.is02ConfigLdif(schemaFile))
{
- // Do not import the file containing the definitions of the Schema elements used for configuration
- // because these definitions may vary between versions of OpenDJ.
continue;
}
@@ -670,11 +669,6 @@
}
}
- private boolean is02ConfigLdif(String schemaFile)
- {
- return CONFIG_SCHEMA_ELEMENTS_FILE.equals(schemaFile);
- }
-
private <T> void addElementIfNotNull(Collection<T> col, T element)
{
if (element != null)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/util/SchemaUtils.java b/opendj-server-legacy/src/main/java/org/opends/server/util/SchemaUtils.java
index 18289c4..30a9581 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/util/SchemaUtils.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/util/SchemaUtils.java
@@ -54,6 +54,8 @@
// No implementation required.
}
+ private static final String CONFIG_SCHEMA_ELEMENTS_FILE = "02-config.ldif";
+
/** Represents a password type, including a "not a password" value. */
public enum PasswordType
{
@@ -124,7 +126,7 @@
public static String getElementDefinitionWithFileName(SchemaElement element)
{
final String definition = element.toString();
- return addSchemaFileToElementDefinitionIfAbsent(definition, SchemaUtils.getElementSchemaFile(element));
+ return addSchemaFileToElementDefinitionIfAbsent(definition, getElementSchemaFile(element));
}
/**
@@ -489,4 +491,21 @@
throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, parsingErrorMsg.get(definition), e);
}
}
+
+ /**
+ * Indicates if the provided schema file corresponds to the configuration schema.
+ * <p>
+ * The file containing the definitions of the schema elements used for configuration must not be
+ * imported nor propagated to other servers because these definitions may vary between versions of
+ * OpenDJ.
+ *
+ * @param schemaFile
+ * The name of a file defining schema elements
+ * @return {@code true} if the file defines configuration elements,
+ * {@code false} otherwise
+ */
+ public static boolean is02ConfigLdif(String schemaFile)
+ {
+ return CONFIG_SCHEMA_ELEMENTS_FILE.equals(schemaFile);
+ }
}
--
Gitblit v1.10.0