From 37f1806ad194f564eb7b47c55a26aa2cba6c566d Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Fri, 09 Sep 2016 09:45:23 +0000
Subject: [PATCH] OPENDJ-3089 Update SchemaBackend to use SchemaBuilder when importing an entry
---
opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java | 72 ++++++++++++++++++++----------------
1 files changed, 40 insertions(+), 32 deletions(-)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java
index 0a1b82e..67039d5 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java
@@ -85,7 +85,6 @@
import org.opends.server.core.ModifyOperation;
import org.opends.server.core.SchemaConfigManager;
import org.opends.server.core.SchemaHandler;
-import org.opends.server.core.SchemaHandler.SchemaUpdater;
import org.opends.server.core.SearchOperation;
import org.opends.server.core.ServerContext;
import org.opends.server.schema.AttributeTypeSyntax;
@@ -114,8 +113,6 @@
import org.opends.server.util.LDIFWriter;
import org.opends.server.util.StaticUtils;
-import sun.util.locale.ParseStatus;
-
/**
* This class defines a backend to hold the Directory Server schema information.
* It is a kind of meta-backend in that it doesn't actually hold any data but
@@ -2427,11 +2424,10 @@
*
* @param newSchemaEntry The entry to be imported.
*/
- private void importEntry(Entry newSchemaEntry)
- throws DirectoryException
+ private void importEntry(Entry newSchemaEntry) throws DirectoryException
{
- Schema schema = serverContext.getSchema();
- Schema newSchema = schema.duplicate();
+ org.forgerock.opendj.ldap.schema.Schema schema = schemaHandler.getSchema();
+ SchemaBuilder newSchemaBuilder = new SchemaBuilder(schema);
TreeSet<String> modifiedSchemaFiles = new TreeSet<>();
// loop on the attribute types in the entry just received
@@ -2443,34 +2439,35 @@
// or modified in the schema
for (ByteString v : a)
{
- AttributeType attrType = schema.parseAttributeType(v.toString());
- String schemaFile = getElementSchemaFile(attrType);
+ String definition = v.toString();
+ String schemaFile = SchemaHandler.parseSchemaFileFromElementDefinition(definition);
if (is02ConfigLdif(schemaFile))
{
continue;
}
- oidList.add(attrType.getOID());
+ String oid = SchemaHandler.parseAttributeTypeOID(definition);
+ oidList.add(oid);
try
{
// Register this attribute type in the new schema
// unless it is already defined with the same syntax.
- if (hasDefinitionChanged(schema, attrType))
+ if (hasAttributeTypeDefinitionChanged(schema, oid, definition))
{
- newSchema.registerAttributeType(attrType, schemaFile, true);
+ newSchemaBuilder.addAttributeType(definition, true);
addElementIfNotNull(modifiedSchemaFiles, schemaFile);
}
}
catch (Exception e)
{
- logger.info(NOTE_SCHEMA_IMPORT_FAILED, attrType, e.getMessage());
+ logger.info(NOTE_SCHEMA_IMPORT_FAILED, definition, e.getMessage());
}
}
}
// loop on all the attribute types in the current schema and delete
// them from the new schema if they are not in the imported schema entry.
- for (AttributeType removeType : newSchema.getAttributeTypes())
+ for (AttributeType removeType : schema.getAttributeTypes())
{
String schemaFile = getElementSchemaFile(removeType);
if (is02ConfigLdif(schemaFile) || CORE_SCHEMA_ELEMENTS_FILE.equals(schemaFile))
@@ -2480,7 +2477,7 @@
}
if (!oidList.contains(removeType.getOID()))
{
- newSchema.deregisterAttributeType(removeType);
+ newSchemaBuilder.removeAttributeType(removeType.getOID());
addElementIfNotNull(modifiedSchemaFiles, schemaFile);
}
}
@@ -2494,34 +2491,34 @@
{
// It IS important here to allow the unknown elements that could
// appear in the new config schema.
- ObjectClass newObjectClass = newSchema.parseObjectClass(v.toString());
- String schemaFile = getElementSchemaFile(newObjectClass);
+ String definition = v.toString();
+ String schemaFile = SchemaHandler.parseSchemaFileFromElementDefinition(definition);
if (is02ConfigLdif(schemaFile))
{
continue;
}
-
- oidList.add(newObjectClass.getOID());
+ String oid = SchemaHandler.parseObjectClassOID(definition);
+ oidList.add(oid);
try
{
// Register this ObjectClass in the new schema
// unless it is already defined with the same syntax.
- if (hasDefinitionChanged(schema, newObjectClass))
+ if (hasObjectClassDefinitionChanged(schema, oid, definition))
{
- newSchema.registerObjectClass(newObjectClass, schemaFile, true);
+ newSchemaBuilder.addObjectClass(definition, true);
addElementIfNotNull(modifiedSchemaFiles, schemaFile);
}
}
catch (Exception e)
{
- logger.info(NOTE_SCHEMA_IMPORT_FAILED, newObjectClass, e.getMessage());
+ logger.info(NOTE_SCHEMA_IMPORT_FAILED, definition, e.getMessage());
}
}
}
// loop on all the object classes in the current schema and delete
// them from the new schema if they are not in the imported schema entry.
- for (ObjectClass removeClass : newSchema.getObjectClasses())
+ for (ObjectClass removeClass : schema.getObjectClasses())
{
String schemaFile = getElementSchemaFile(removeClass);
if (is02ConfigLdif(schemaFile))
@@ -2530,17 +2527,17 @@
}
if (!oidList.contains(removeClass.getOID()))
{
- newSchema.deregisterObjectClass(removeClass);
+ newSchemaBuilder.removeObjectClass(removeClass.getOID());
addElementIfNotNull(modifiedSchemaFiles, schemaFile);
}
}
// Finally, if there were some modifications, save the new schema
- // in the Schema Files and update DirectoryServer.
if (!modifiedSchemaFiles.isEmpty())
{
+ org.forgerock.opendj.ldap.schema.Schema newSchema = newSchemaBuilder.toSchema();
+ schemaHandler.updateSchema(newSchema);
updateSchemaFiles(newSchema, modifiedSchemaFiles);
- DirectoryServer.setSchema(newSchema);
}
}
@@ -2561,16 +2558,27 @@
}
}
- private boolean hasDefinitionChanged(Schema schema, AttributeType newAttrType)
+ private boolean hasAttributeTypeDefinitionChanged(org.forgerock.opendj.ldap.schema.Schema schema, String oid,
+ String definition)
{
- AttributeType oldAttrType = schema.getAttributeType(newAttrType.getOID());
- return oldAttrType.isPlaceHolder() || !oldAttrType.toString().equals(newAttrType.toString());
+ if (schema.hasAttributeType(oid))
+ {
+ AttributeType oldAttrType = schema.getAttributeType(oid);
+ return !oldAttrType.toString().equals(definition);
+
+ }
+ return true;
}
- private boolean hasDefinitionChanged(Schema schema, ObjectClass newObjectClass)
+ private boolean hasObjectClassDefinitionChanged(org.forgerock.opendj.ldap.schema.Schema schema, String oid,
+ String definition)
{
- ObjectClass oldObjectClass = schema.getObjectClass(newObjectClass.getOID());
- return oldObjectClass.isPlaceHolder() || !oldObjectClass.toString().equals(newObjectClass.toString());
+ if (schema.hasObjectClass(oid))
+ {
+ ObjectClass oldObjectClass = schema.getObjectClass(oid);
+ return !oldObjectClass.toString().equals(definition);
+ }
+ return true;
}
@Override
--
Gitblit v1.10.0