From 5ee33e1763d2574f769a8a278806e882694feb00 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 AddSchemaFileTask class to replace server Schema usage by SchemaHandler
---
opendj-server-legacy/src/main/java/org/opends/server/tasks/AddSchemaFileTask.java | 63 +++++++++++++++++++++++--------
1 files changed, 47 insertions(+), 16 deletions(-)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tasks/AddSchemaFileTask.java b/opendj-server-legacy/src/main/java/org/opends/server/tasks/AddSchemaFileTask.java
index d70a4c4..3f1ad23 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tasks/AddSchemaFileTask.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tasks/AddSchemaFileTask.java
@@ -27,13 +27,16 @@
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.schema.AttributeType;
+import org.forgerock.opendj.ldap.schema.Schema;
+import org.forgerock.opendj.ldap.schema.SchemaBuilder;
import org.forgerock.opendj.server.config.server.SynchronizationProviderCfg;
import org.opends.server.api.ClientConnection;
import org.opends.server.api.SynchronizationProvider;
import org.opends.server.backends.task.Task;
import org.opends.server.backends.task.TaskState;
import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.SchemaConfigManager;
+import org.opends.server.core.SchemaHandler;
+import org.opends.server.core.ServerContext;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeBuilder;
import org.opends.server.types.DirectoryException;
@@ -43,8 +46,6 @@
import org.opends.server.types.Modification;
import org.opends.server.types.Operation;
import org.opends.server.types.Privilege;
-import org.opends.server.types.Schema;
-import org.opends.server.types.SchemaWriter;
import org.opends.server.util.SchemaUtils;
import static org.opends.messages.TaskMessages.*;
@@ -89,7 +90,8 @@
// Get the attribute that specifies which schema file(s) to add.
Entry taskEntry = getTaskEntry();
- AttributeType attrType = DirectoryServer.getSchema().getAttributeType(ATTR_TASK_ADDSCHEMAFILE_FILENAME);
+ ServerContext serverContext = getServerContext();
+ AttributeType attrType = serverContext.getSchema().getAttributeType(ATTR_TASK_ADDSCHEMAFILE_FILENAME);
List<Attribute> attrList = taskEntry.getAllAttributes(attrType);
if (attrList.isEmpty())
{
@@ -100,7 +102,7 @@
// Get the name(s) of the schema files to add and make sure they exist in
// the schema directory.
- String schemaInstanceDirectory = DirectoryServer.getEnvironmentConfig().getSchemaDirectory().getPath();
+ File schemaInstanceDirectory = getSchemaDirectory();
filesToAdd = new TreeSet<>();
for (Attribute a : attrList)
{
@@ -133,17 +135,20 @@
}
}
- // Create a new dummy schema and make sure that we can add the contents of
- // all the schema files into it. Even though this duplicates work we'll
- // have to do later, it will be good to do it now as well so we can reject
+ // Make sure that we can add the contents of all the schema files into the schema.
+ // Even though this duplicates work we'll have to do later,
+ // it will be good to do it now as well so we can reject
// the entry immediately which will fail the attempt by the client to add it
// to the server, rather than having to check its status after the fact.
- Schema schema = DirectoryServer.getSchema().duplicate();
+ final SchemaHandler schemaHandler = serverContext.getSchemaHandler();
+ final Schema currentSchema = schemaHandler.getSchema();
+ final SchemaBuilder schemaBuilder = new SchemaBuilder(currentSchema);
for (String schemaFile : filesToAdd)
{
try
{
- SchemaConfigManager.loadSchemaFile(schema, schemaFile);
+ File file = new File(schemaInstanceDirectory, schemaFile);
+ schemaHandler.loadSchemaFileIntoSchemaBuilder(file, schemaBuilder, currentSchema);
}
catch (ConfigException | InitializationException e)
{
@@ -155,6 +160,19 @@
}
}
+ private File getSchemaDirectory() throws DirectoryException
+ {
+ try
+ {
+ return getServerContext().getSchemaHandler().getSchemaDirectoryPath();
+ }
+ catch (InitializationException e)
+ {
+ logger.traceException(e);
+ throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, e.getMessageObject());
+ }
+ }
+
@Override
protected TaskState runTask()
{
@@ -170,12 +188,16 @@
try
{
LinkedList<Modification> mods = new LinkedList<>();
- Schema schema = DirectoryServer.getSchema().duplicate();
+ final SchemaHandler schemaHandler = getServerContext().getSchemaHandler();
+ final Schema currentSchema = schemaHandler.getSchema();
+ final SchemaBuilder schemaBuilder = new SchemaBuilder(currentSchema);
for (String schemaFile : filesToAdd)
{
try
{
- List<Modification> modList = SchemaConfigManager.loadSchemaFileReturnModifications(schema, schemaFile);
+ File file = new File(getSchemaDirectory(), schemaFile);
+ List<Modification> modList =
+ schemaHandler.loadSchemaFileIntoSchemaBuilderAndReturnModifications(file, schemaBuilder, currentSchema);
for (Modification m : modList)
{
Attribute a = m.getAttribute();
@@ -188,7 +210,7 @@
mods.add(new Modification(m.getModificationType(), builder.toAttribute()));
}
}
- catch (ConfigException | InitializationException e)
+ catch (DirectoryException | ConfigException | InitializationException e)
{
logger.traceException(e);
logger.error(ERR_TASK_ADDSCHEMAFILE_ERROR_LOADING_SCHEMA_FILE, schemaFile, e.getMessage());
@@ -214,11 +236,20 @@
}
}
- SchemaWriter.writeConcatenatedSchema();
+ final Schema newSchema = schemaBuilder.toSchema();
+ try
+ {
+ schemaHandler.updateSchemaAndConcatenatedSchemaFiles(newSchema);
+ }
+ catch (DirectoryException e)
+ {
+ // This is very unlikely to happen because each schema file was previously loaded without error
+ logger.traceException(e);
+ logger.error(ERR_TASK_ADDSCHEMAFILE_SCHEMA_VALIDATION_ERROR, e.getMessage());
+ return TaskState.STOPPED_BY_ERROR;
+ }
}
- schema.setYoungestModificationTime(System.currentTimeMillis());
- DirectoryServer.setSchema(schema);
return TaskState.COMPLETED_SUCCESSFULLY;
}
finally
--
Gitblit v1.10.0