From 9883c577837a2412391d3c8c638f8bbba10b9bcd Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Fri, 09 Sep 2016 09:45:25 +0000
Subject: [PATCH] OPENDJ-3089 OPENDJ-1237 Refactor SchemaWriter class: reorganize methods in the class
---
opendj-server-legacy/src/main/java/org/opends/server/types/SchemaWriter.java | 463 +++++++++++++++++++++++++++++----------------------------
1 files changed, 232 insertions(+), 231 deletions(-)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/types/SchemaWriter.java b/opendj-server-legacy/src/main/java/org/opends/server/types/SchemaWriter.java
index 8586a77..e60a234 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/types/SchemaWriter.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/types/SchemaWriter.java
@@ -21,7 +21,8 @@
import static org.forgerock.opendj.ldap.schema.CoreSchema.*;
import static org.opends.messages.BackendMessages.*;
import static org.opends.server.config.ConfigConstants.*;
-import static org.opends.server.util.CollectionUtils.*;
+import static org.opends.server.util.CollectionUtils.newArrayList;
+import static org.opends.server.util.CollectionUtils.newLinkedList;
import static org.opends.server.util.SchemaUtils.getElementSchemaFile;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.*;
@@ -103,132 +104,62 @@
}
/**
- * Compares the provided sets of schema element definitions and writes any differences found into
- * the given list of modifications.
+ * Rewrites all schema files defined in the provided list of modified files with the provided
+ * schema.
*
- * @param oldElements
- * The set of elements of the specified type read from the previous concatenated schema
- * files.
- * @param newElements
- * The set of elements of the specified type read from the server's current schema.
- * @param elementType
- * The attribute type associated with the schema element being compared.
- * @param mods
- * The list of modifications into which any identified differences should be written.
+ * @param newSchema
+ * The new schema that should be used.
+ * @param extraAttributes
+ * The extra attributes to write in user schema file.
+ * @param modifiedSchemaFiles
+ * The list of files that should be modified.
+ * @param alertGenerator
+ * The alert generator.
+ * @throws DirectoryException
+ * When the new file cannot be written.
*/
- private static void compareConcatenatedSchema(Set<String> oldElements, Set<String> newElements,
- AttributeType elementType, List<Modification> mods)
+ public void updateSchemaFiles(Schema newSchema, Collection<Attribute> extraAttributes,
+ TreeSet<String> modifiedSchemaFiles, AlertGenerator alertGenerator)
+ throws DirectoryException
{
- AttributeBuilder builder = new AttributeBuilder(elementType);
- addModification(mods, DELETE, oldElements, newElements, builder);
-
- builder.setAttributeDescription(AttributeDescription.create(elementType));
- addModification(mods, ADD, newElements, oldElements, builder);
- }
-
- /**
- * Reads the files contained in the schema directory and generates a concatenated view of their
- * contents in the provided sets.
- *
- * @param attributeTypes
- * The set into which to place the attribute types read from the schema files.
- * @param objectClasses
- * The set into which to place the object classes read from the schema files.
- * @param nameForms
- * The set into which to place the name forms read from the schema files.
- * @param ditContentRules
- * The set into which to place the DIT content rules read from the schema files.
- * @param ditStructureRules
- * The set into which to place the DIT structure rules read from the schema files.
- * @param matchingRuleUses
- * The set into which to place the matching rule uses read from the schema files.
- * @param ldapSyntaxes
- * The set into which to place the ldap syntaxes read from the schema files.
- * @throws IOException
- * If a problem occurs while reading the schema file elements.
- */
- private void generateConcatenatedSchema(Set<String> attributeTypes, Set<String> objectClasses,
- Set<String> nameForms, Set<String> ditContentRules, Set<String> ditStructureRules, Set<String> matchingRuleUses,
- Set<String> ldapSyntaxes) throws IOException
- {
- // Get a sorted list of the files in the schema directory.
- TreeSet<File> schemaFiles = new TreeSet<>();
- String schemaDirectory = getSchemaDirectoryPath();
-
- final FilenameFilter filter = new SchemaHandler.SchemaFileFilter();
- for (File f : new File(schemaDirectory).listFiles(filter))
+ // We'll re-write all
+ // impacted schema files by first creating them in a temporary location
+ // and then replacing the existing schema files with the new versions.
+ // If all that goes successfully, then activate the new schema.
+ HashMap<String, File> tempSchemaFiles = new HashMap<>();
+ try
{
- if (f.isFile())
+ for (String schemaFile : modifiedSchemaFiles)
{
- schemaFiles.add(f);
+ File tempSchemaFile = writeTempSchemaFile(newSchema, extraAttributes, schemaFile);
+ tempSchemaFiles.put(schemaFile, tempSchemaFile);
}
+
+ installSchemaFiles(alertGenerator, tempSchemaFiles);
+ }
+ catch (DirectoryException de)
+ {
+ logger.traceException(de);
+
+ throw de;
+ }
+ catch (Exception e)
+ {
+ logger.traceException(e);
+
+ LocalizableMessage message =
+ ERR_SCHEMA_MODIFY_CANNOT_WRITE_NEW_SCHEMA.get(getExceptionMessage(e));
+ throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), message, e);
+ }
+ finally
+ {
+ cleanUpTempSchemaFiles(tempSchemaFiles);
}
- // Open each of the files in order and read the elements that they
- // contain, appending them to the appropriate lists.
- for (File f : schemaFiles)
- {
- List<StringBuilder> lines = readSchemaElementsFromLdif(f);
-
- // Iterate through each line in the list. Find the colon and
- // get the attribute name at the beginning. If it's something
- // that we don't recognize, then skip it. Otherwise, add the
- // X-SCHEMA-FILE extension and add it to the appropriate schema
- // element list.
- for (StringBuilder buffer : lines)
- {
- String line = buffer.toString().trim();
- parseSchemaLine(line, f.getName(), attributeTypes, objectClasses, nameForms, ditContentRules,
- ditStructureRules, matchingRuleUses, ldapSyntaxes);
- }
- }
- }
-
- private String getSchemaDirectoryPath()
- {
- File schemaDir = serverContext.getEnvironment().getSchemaDirectory();
- return schemaDir != null ? schemaDir.getAbsolutePath() : null;
- }
-
- /**
- * Reads data from the specified concatenated schema file into the provided sets.
- *
- * @param concatSchemaFile
- * The concatenated schema file to be read.
- * @param attributeTypes
- * The set into which to place the attribute types read from the concatenated schema
- * file.
- * @param objectClasses
- * The set into which to place the object classes read from the concatenated schema file.
- * @param nameForms
- * The set into which to place the name forms read from the concatenated schema file.
- * @param ditContentRules
- * The set into which to place the DIT content rules read from the concatenated schema
- * file.
- * @param ditStructureRules
- * The set into which to place the DIT structure rules read from the concatenated schema
- * file.
- * @param matchingRuleUses
- * The set into which to place the matching rule uses read from the concatenated schema
- * file.
- * @param ldapSyntaxes
- * The set into which to place the ldap syntaxes read from the concatenated schema file.
- * @throws IOException
- * If a problem occurs while reading the schema file elements.
- */
- private static void readConcatenatedSchema(File concatSchemaFile, Set<String> attributeTypes,
- Set<String> objectClasses, Set<String> nameForms, Set<String> ditContentRules, Set<String> ditStructureRules,
- Set<String> matchingRuleUses, Set<String> ldapSyntaxes) throws IOException
- {
- try (BufferedReader reader = new BufferedReader(new FileReader(concatSchemaFile)))
- {
- String line;
- while ((line = reader.readLine()) != null)
- {
- parseSchemaLine(line, null, attributeTypes, objectClasses, nameForms, ditContentRules, ditStructureRules,
- matchingRuleUses, ldapSyntaxes);
- }
- }
+ // Create a single file with all of the concatenated schema information
+ // that we can use on startup to detect whether the schema files have been
+ // edited with the server offline.
+ writeConcatenatedSchema();
}
/**
@@ -360,13 +291,127 @@
}
}
- /** Returns the upgrade directory of the server. */
- private File getUpgradeDirectory()
+ /**
+ * Reads the files contained in the schema directory and generates a concatenated view of their
+ * contents in the provided sets.
+ *
+ * @param attributeTypes
+ * The set into which to place the attribute types read from the schema files.
+ * @param objectClasses
+ * The set into which to place the object classes read from the schema files.
+ * @param nameForms
+ * The set into which to place the name forms read from the schema files.
+ * @param ditContentRules
+ * The set into which to place the DIT content rules read from the schema files.
+ * @param ditStructureRules
+ * The set into which to place the DIT structure rules read from the schema files.
+ * @param matchingRuleUses
+ * The set into which to place the matching rule uses read from the schema files.
+ * @param ldapSyntaxes
+ * The set into which to place the ldap syntaxes read from the schema files.
+ * @throws IOException
+ * If a problem occurs while reading the schema file elements.
+ */
+ private void generateConcatenatedSchema(Set<String> attributeTypes, Set<String> objectClasses,
+ Set<String> nameForms, Set<String> ditContentRules, Set<String> ditStructureRules, Set<String> matchingRuleUses,
+ Set<String> ldapSyntaxes) throws IOException
{
- File configFile = serverContext.getEnvironment().getConfigFile();
- File configDirectory = configFile.getParentFile();
- File upgradeDirectory = new File(configDirectory, "upgrade");
- return upgradeDirectory;
+ // Get a sorted list of the files in the schema directory.
+ TreeSet<File> schemaFiles = new TreeSet<>();
+ String schemaDirectory = getSchemaDirectoryPath();
+
+ final FilenameFilter filter = new SchemaHandler.SchemaFileFilter();
+ for (File f : new File(schemaDirectory).listFiles(filter))
+ {
+ if (f.isFile())
+ {
+ schemaFiles.add(f);
+ }
+ }
+
+ // Open each of the files in order and read the elements that they
+ // contain, appending them to the appropriate lists.
+ for (File f : schemaFiles)
+ {
+ List<StringBuilder> lines = readSchemaElementsFromLdif(f);
+
+ // Iterate through each line in the list. Find the colon and
+ // get the attribute name at the beginning. If it's something
+ // that we don't recognize, then skip it. Otherwise, add the
+ // X-SCHEMA-FILE extension and add it to the appropriate schema
+ // element list.
+ for (StringBuilder buffer : lines)
+ {
+ String line = buffer.toString().trim();
+ parseSchemaLine(line, f.getName(), attributeTypes, objectClasses, nameForms, ditContentRules,
+ ditStructureRules, matchingRuleUses, ldapSyntaxes);
+ }
+ }
+ }
+
+ /**
+ * Reads data from the specified concatenated schema file into the provided sets.
+ *
+ * @param concatSchemaFile
+ * The concatenated schema file to be read.
+ * @param attributeTypes
+ * The set into which to place the attribute types read from the concatenated schema
+ * file.
+ * @param objectClasses
+ * The set into which to place the object classes read from the concatenated schema file.
+ * @param nameForms
+ * The set into which to place the name forms read from the concatenated schema file.
+ * @param ditContentRules
+ * The set into which to place the DIT content rules read from the concatenated schema
+ * file.
+ * @param ditStructureRules
+ * The set into which to place the DIT structure rules read from the concatenated schema
+ * file.
+ * @param matchingRuleUses
+ * The set into which to place the matching rule uses read from the concatenated schema
+ * file.
+ * @param ldapSyntaxes
+ * The set into which to place the ldap syntaxes read from the concatenated schema file.
+ * @throws IOException
+ * If a problem occurs while reading the schema file elements.
+ */
+ private static void readConcatenatedSchema(File concatSchemaFile, Set<String> attributeTypes,
+ Set<String> objectClasses, Set<String> nameForms, Set<String> ditContentRules, Set<String> ditStructureRules,
+ Set<String> matchingRuleUses, Set<String> ldapSyntaxes) throws IOException
+ {
+ try (BufferedReader reader = new BufferedReader(new FileReader(concatSchemaFile)))
+ {
+ String line;
+ while ((line = reader.readLine()) != null)
+ {
+ parseSchemaLine(line, null, attributeTypes, objectClasses, nameForms, ditContentRules, ditStructureRules,
+ matchingRuleUses, ldapSyntaxes);
+ }
+ }
+ }
+
+ /**
+ * Compares the provided sets of schema element definitions and writes any differences found into
+ * the given list of modifications.
+ *
+ * @param oldElements
+ * The set of elements of the specified type read from the previous concatenated schema
+ * files.
+ * @param newElements
+ * The set of elements of the specified type read from the server's current schema.
+ * @param elementType
+ * The attribute type associated with the schema element being compared.
+ * @param mods
+ * The list of modifications into which any identified differences should be written.
+ */
+ private static void compareConcatenatedSchema(Set<String> oldElements, Set<String> newElements,
+ AttributeType elementType, List<Modification> mods)
+ {
+ AttributeBuilder builder = new AttributeBuilder(elementType);
+ addModification(mods, DELETE, oldElements, newElements, builder);
+
+ builder.setAttributeDescription(AttributeDescription.create(elementType));
+ addModification(mods, ADD, newElements, oldElements, builder);
}
private static void addModification(List<Modification> mods, ModificationType modType, Set<String> included,
@@ -392,33 +437,6 @@
definitions.add(getSchemaDefinition(line.substring(attrName.length()), fileName));
}
- private File getConcatenatedSchemaFile() throws InitializationException
- {
- File upgradeDirectory = getUpgradeDirectory();
- File concatFile = new File(upgradeDirectory, SCHEMA_CONCAT_FILE_NAME);
- if (concatFile.exists())
- {
- return concatFile.getAbsoluteFile();
- }
-
- String fileName = SCHEMA_BASE_FILE_NAME_WITHOUT_REVISION + BuildVersion.instanceVersion().getRevision();
- concatFile = new File(upgradeDirectory, fileName);
- if (concatFile.exists())
- {
- return concatFile.getAbsoluteFile();
- }
-
- String runningUnitTestsStr = System.getProperty(PROPERTY_RUNNING_UNIT_TESTS);
- if ("true".equalsIgnoreCase(runningUnitTestsStr))
- {
- writeConcatenatedSchema();
- concatFile = new File(upgradeDirectory, SCHEMA_CONCAT_FILE_NAME);
- return concatFile.getAbsoluteFile();
- }
- throw new InitializationException(ERR_SCHEMA_CANNOT_FIND_CONCAT_FILE.get(upgradeDirectory.getAbsolutePath(),
- SCHEMA_CONCAT_FILE_NAME, concatFile.getName()));
- }
-
private static String getSchemaDefinition(String definition, String schemaFile) throws ParseException
{
if (definition.startsWith("::"))
@@ -483,6 +501,68 @@
}
}
+ private static void writeLines(BufferedWriter writer, String... lines) throws IOException
+ {
+ for (String line : lines)
+ {
+ writer.write(line);
+ writer.newLine();
+ }
+ }
+
+ private static void writeLines(BufferedWriter writer, String beforeColumn, Set<String> lines) throws IOException
+ {
+ for (String line : lines)
+ {
+ writer.write(beforeColumn);
+ writer.write(": ");
+ writer.write(line);
+ writer.newLine();
+ }
+ }
+
+ private String getSchemaDirectoryPath()
+ {
+ File schemaDir = serverContext.getEnvironment().getSchemaDirectory();
+ return schemaDir != null ? schemaDir.getAbsolutePath() : null;
+ }
+
+ /** Returns the upgrade directory of the server. */
+ private File getUpgradeDirectory()
+ {
+ File configFile = serverContext.getEnvironment().getConfigFile();
+ File configDirectory = configFile.getParentFile();
+ File upgradeDirectory = new File(configDirectory, "upgrade");
+ return upgradeDirectory;
+ }
+
+ private File getConcatenatedSchemaFile() throws InitializationException
+ {
+ File upgradeDirectory = getUpgradeDirectory();
+ File concatFile = new File(upgradeDirectory, SCHEMA_CONCAT_FILE_NAME);
+ if (concatFile.exists())
+ {
+ return concatFile.getAbsoluteFile();
+ }
+
+ String fileName = SCHEMA_BASE_FILE_NAME_WITHOUT_REVISION + BuildVersion.instanceVersion().getRevision();
+ concatFile = new File(upgradeDirectory, fileName);
+ if (concatFile.exists())
+ {
+ return concatFile.getAbsoluteFile();
+ }
+
+ String runningUnitTestsStr = System.getProperty(PROPERTY_RUNNING_UNIT_TESTS);
+ if ("true".equalsIgnoreCase(runningUnitTestsStr))
+ {
+ writeConcatenatedSchema();
+ concatFile = new File(upgradeDirectory, SCHEMA_CONCAT_FILE_NAME);
+ return concatFile.getAbsoluteFile();
+ }
+ throw new InitializationException(ERR_SCHEMA_CANNOT_FIND_CONCAT_FILE.get(upgradeDirectory.getAbsolutePath(),
+ SCHEMA_CONCAT_FILE_NAME, concatFile.getName()));
+ }
+
private List<StringBuilder> readSchemaElementsFromLdif(File f) throws IOException, FileNotFoundException
{
final LinkedList<StringBuilder> lines = new LinkedList<>();
@@ -509,85 +589,6 @@
return lines;
}
- private static void writeLines(BufferedWriter writer, String... lines) throws IOException
- {
- for (String line : lines)
- {
- writer.write(line);
- writer.newLine();
- }
- }
-
- private static void writeLines(BufferedWriter writer, String beforeColumn, Set<String> lines) throws IOException
- {
- for (String line : lines)
- {
- writer.write(beforeColumn);
- writer.write(": ");
- writer.write(line);
- writer.newLine();
- }
- }
-
- /**
- * Rewrites all schema files defined in the provided list of modified files with the provided
- * schema.
- *
- * @param newSchema
- * The new schema that should be used.
- * @param extraAttributes
- * The extra attributes to write in user schema file.
- * @param modifiedSchemaFiles
- * The list of files that should be modified.
- * @param alertGenerator
- * The alert generator.
- * @throws DirectoryException
- * When the new file cannot be written.
- */
- public void updateSchemaFiles(Schema newSchema, Collection<Attribute> extraAttributes,
- TreeSet<String> modifiedSchemaFiles, AlertGenerator alertGenerator)
- throws DirectoryException
- {
- // We'll re-write all
- // impacted schema files by first creating them in a temporary location
- // and then replacing the existing schema files with the new versions.
- // If all that goes successfully, then activate the new schema.
- HashMap<String, File> tempSchemaFiles = new HashMap<>();
- try
- {
- for (String schemaFile : modifiedSchemaFiles)
- {
- File tempSchemaFile = writeTempSchemaFile(newSchema, extraAttributes, schemaFile);
- tempSchemaFiles.put(schemaFile, tempSchemaFile);
- }
-
- installSchemaFiles(alertGenerator, tempSchemaFiles);
- }
- catch (DirectoryException de)
- {
- logger.traceException(de);
-
- throw de;
- }
- catch (Exception e)
- {
- logger.traceException(e);
-
- LocalizableMessage message =
- ERR_SCHEMA_MODIFY_CANNOT_WRITE_NEW_SCHEMA.get(getExceptionMessage(e));
- throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), message, e);
- }
- finally
- {
- cleanUpTempSchemaFiles(tempSchemaFiles);
- }
-
- // Create a single file with all of the concatenated schema information
- // that we can use on startup to detect whether the schema files have been
- // edited with the server offline.
- writeConcatenatedSchema();
- }
-
/**
* Creates an empty entry that may be used as the basis for a new schema file.
*
--
Gitblit v1.10.0