From 27d6fa4d5acd2cb46d620876f65a6633b82c6be8 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Mon, 30 May 2016 13:58:13 +0000
Subject: [PATCH] OPENDJ-3001 Migrate NameForm to SDK
---
opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java | 228 +++++++++------------------------------------------------
1 files changed, 36 insertions(+), 192 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 9bc704c..9b73274 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
@@ -64,6 +64,7 @@
import org.forgerock.opendj.ldap.schema.CoreSchema;
import org.forgerock.opendj.ldap.schema.MatchingRule;
import org.forgerock.opendj.ldap.schema.MatchingRuleUse;
+import org.forgerock.opendj.ldap.schema.NameForm;
import org.forgerock.opendj.ldap.schema.ObjectClass;
import org.forgerock.opendj.ldap.schema.ObjectClassType;
import org.forgerock.opendj.ldap.schema.SchemaElement;
@@ -84,7 +85,6 @@
import org.opends.server.schema.DITContentRuleSyntax;
import org.opends.server.schema.DITStructureRuleSyntax;
import org.opends.server.schema.GeneralizedTimeSyntax;
-import org.opends.server.schema.NameFormSyntax;
import org.opends.server.schema.ServerSchemaElement;
import org.opends.server.schema.SomeSchemaElement;
import org.opends.server.types.Attribute;
@@ -104,7 +104,6 @@
import org.opends.server.types.LDIFImportConfig;
import org.opends.server.types.LDIFImportResult;
import org.opends.server.types.Modification;
-import org.opends.server.types.NameForm;
import org.opends.server.types.Privilege;
import org.opends.server.types.RestoreConfig;
import org.opends.server.types.Schema;
@@ -580,7 +579,7 @@
*/
buildSchemaAttribute(schema.getSyntaxes(), userAttrs,
operationalAttrs, ldapSyntaxesType, includeSchemaFile, false, true);
- buildSchemaAttribute(schema.getNameFormsByNameOrOID().values(), userAttrs,
+ buildSchemaAttribute(schema.getNameForms(), userAttrs,
operationalAttrs, nameFormsType, includeSchemaFile, false, true);
buildSchemaAttribute(schema.getDITContentRules().values(), userAttrs,
operationalAttrs, ditContentRulesType, includeSchemaFile, false, true);
@@ -769,21 +768,7 @@
{
for (ByteString v : a)
{
- NameForm nf;
- try
- {
- nf = NameFormSyntax.decodeNameForm(v, newSchema, false);
- }
- catch (DirectoryException de)
- {
- logger.traceException(de);
-
- LocalizableMessage message = ERR_SCHEMA_MODIFY_CANNOT_DECODE_NAME_FORM.get(
- v, de.getMessageObject());
- throw new DirectoryException(
- ResultCode.INVALID_ATTRIBUTE_SYNTAX, message, de);
- }
-
+ NameForm nf = newSchema.parseNameForm(v.toString());
addNameForm(nf, newSchema, modifiedSchemaFiles);
}
}
@@ -893,21 +878,7 @@
{
for (ByteString v : a)
{
- NameForm nf;
- try
- {
- nf = NameFormSyntax.decodeNameForm(v, newSchema, false);
- }
- catch (DirectoryException de)
- {
- logger.traceException(de);
-
- LocalizableMessage message = ERR_SCHEMA_MODIFY_CANNOT_DECODE_NAME_FORM.get(
- v, de.getMessageObject());
- throw new DirectoryException(
- ResultCode.INVALID_ATTRIBUTE_SYNTAX, message, de);
- }
-
+ NameForm nf = newSchema.parseNameForm(v.toString());
removeNameForm(nf, newSchema, mods, pos, modifiedSchemaFiles);
}
}
@@ -1155,13 +1126,13 @@
// Otherwise, we're replacing an existing one.
if (existingType.isPlaceHolder())
{
- String schemaFile = addNewSchemaElement(modifiedSchemaFiles, new SomeSchemaElement(attributeType));
+ String schemaFile = addNewSchemaElement(modifiedSchemaFiles, new ServerSchemaElement(attributeType));
schema.registerAttributeType(attributeType, schemaFile, false);
}
else
{
String schemaFile = replaceExistingSchemaElement(
- modifiedSchemaFiles, new SomeSchemaElement(attributeType), new SomeSchemaElement(existingType));
+ modifiedSchemaFiles, new ServerSchemaElement(attributeType), new ServerSchemaElement(existingType));
schema.replaceAttributeType(attributeType, existingType, schemaFile);
}
}
@@ -1186,15 +1157,6 @@
modifiedSchemaFiles.add(schemaFile);
}
- /** Update list of modified files and return the schema file to use for the added element (may be null). */
- private String addNewSchemaElement(Set<String> modifiedSchemaFiles, SomeSchemaElement elem)
- {
- String schemaFile = elem.getSchemaFile();
- String finalFile = schemaFile != null ? schemaFile : FILE_USER_SCHEMA_ELEMENTS;
- modifiedSchemaFiles.add(finalFile);
- return schemaFile == null ? finalFile : null;
- }
-
/**
* Update list of modified files and return the schema file to use for the
* added element (may be null).
@@ -1233,33 +1195,6 @@
}
}
- /** Update list of modified files and return the schema file to use for the new element (may be null). */
- private String replaceExistingSchemaElement(
- Set<String> modifiedSchemaFiles, SomeSchemaElement newElem, SomeSchemaElement existingElem)
- {
- String newSchemaFile = newElem.getSchemaFile();
- String oldSchemaFile = existingElem.getSchemaFile();
- if (newSchemaFile == null)
- {
- if (oldSchemaFile == null)
- {
- oldSchemaFile = FILE_USER_SCHEMA_ELEMENTS;
- }
- modifiedSchemaFiles.add(oldSchemaFile);
- return oldSchemaFile;
- }
- else if (oldSchemaFile == null || oldSchemaFile.equals(newSchemaFile))
- {
- modifiedSchemaFiles.add(newSchemaFile);
- }
- else
- {
- modifiedSchemaFiles.add(newSchemaFile);
- modifiedSchemaFiles.add(oldSchemaFile);
- }
- return null;
- }
-
/**
* Update list of modified files and return the schema file to use for the new
* element (may be null).
@@ -1343,37 +1278,6 @@
}
}
- // Make sure that the attribute type isn't used as a required or optional
- // attribute type in any objectclass.
- for (ObjectClass oc : schema.getObjectClasses())
- {
- if (oc.getDeclaredRequiredAttributes().contains(removeType) ||
- (oc.getDeclaredOptionalAttributes().contains(removeType) && !oc.isExtensible()))
- {
- LocalizableMessage message = ERR_SCHEMA_MODIFY_REMOVE_AT_IN_OC.get(
- removeType.getNameOrOID(), oc.getNameOrOID());
- throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message);
- }
- }
-
- // Make sure that the attribute type isn't used as a required or optional
- // attribute type in any name form.
- for (List<NameForm> mappedForms :
- schema.getNameFormsByObjectClass().values())
- {
- for(NameForm nf : mappedForms)
- {
- if (nf.getRequiredAttributes().contains(removeType) ||
- nf.getOptionalAttributes().contains(removeType))
- {
- LocalizableMessage message = ERR_SCHEMA_MODIFY_REMOVE_AT_IN_NF.get(
- removeType.getNameOrOID(), nf.getNameOrOID());
- throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM,
- message);
- }
- }
- }
-
// Make sure that the attribute type isn't used as a required, optional, or
// prohibited attribute type in any DIT content rule.
for (DITContentRule dcr : schema.getDITContentRules().values())
@@ -1402,7 +1306,7 @@
// If we've gotten here, then it's OK to remove the attribute type from
// the schema.
schema.deregisterAttributeType(removeType);
- String schemaFile = new SomeSchemaElement(removeType).getSchemaFile();
+ String schemaFile = new ServerSchemaElement(removeType).getSchemaFile();
if (schemaFile != null)
{
modifiedSchemaFiles.add(schemaFile);
@@ -1513,13 +1417,13 @@
// Otherwise, we're replacing an existing one.
if (existingClass.isPlaceHolder())
{
- String schemaFile = addNewSchemaElement(modifiedSchemaFiles, new SomeSchemaElement(objectClass));
+ String schemaFile = addNewSchemaElement(modifiedSchemaFiles, new ServerSchemaElement(objectClass));
schema.registerObjectClass(objectClass, schemaFile, false);
}
else
{
final String schemaFile = replaceExistingSchemaElement(
- modifiedSchemaFiles, new SomeSchemaElement(objectClass), new SomeSchemaElement(existingClass));
+ modifiedSchemaFiles, new ServerSchemaElement(objectClass), new ServerSchemaElement(existingClass));
schema.replaceObjectClass(objectClass, existingClass, schemaFile);
}
}
@@ -1620,8 +1524,8 @@
// Make sure that the objectclass isn't used as the structural class for
// any name form.
- List<NameForm> mappedForms = schema.getNameForm(removeClass);
- if (mappedForms != null)
+ Collection<NameForm> mappedForms = schema.getNameForm(removeClass);
+ if (!mappedForms.isEmpty())
{
StringBuilder buffer = new StringBuilder();
for(NameForm nf : mappedForms)
@@ -1677,52 +1581,9 @@
Set<String> modifiedSchemaFiles)
throws DirectoryException
{
- // First, see if the specified name form already exists. We'll check the
- // OID and all of the names, which means that it's possible there could be
- // more than one match (although if there is, then we'll refuse the
- // operation).
- NameForm existingNF =
- schema.getNameForm(nameForm.getOID());
- for (String name : nameForm.getNames().keySet())
- {
- NameForm nf = schema.getNameForm(name);
- if (nf == null)
- {
- continue;
- }
- else if (existingNF == null)
- {
- existingNF = nf;
- }
- else if (existingNF != nf)
- {
- // NOTE: We really do want to use "!=" instead of "! t.equals()"
- // because we want to check whether it's the same object instance, not
- // just a logical equivalent.
- LocalizableMessage message =
- ERR_SCHEMA_MODIFY_MULTIPLE_CONFLICTS_FOR_ADD_NAME_FORM
- .get(nameForm.getNameOrOID(), existingNF.getNameOrOID(),
- nf.getNameOrOID());
- throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message);
- }
- }
-
- // Make sure that the new name form doesn't reference an undefined
- // structural class, or an undefined required or optional attribute type, or
- // that any of them are marked OBSOLETE.
+ // Make sure that the new name form doesn't reference an objectclass
+ // or attributes that are marked OBSOLETE.
ObjectClass structuralClass = nameForm.getStructuralClass();
- if (! schema.hasObjectClass(structuralClass.getOID()))
- {
- LocalizableMessage message = ERR_SCHEMA_MODIFY_NF_UNDEFINED_STRUCTURAL_OC.get(
- nameForm.getNameOrOID(), structuralClass.getNameOrOID());
- throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message);
- }
- if (structuralClass.getObjectClassType() != ObjectClassType.STRUCTURAL)
- {
- LocalizableMessage message = ERR_SCHEMA_MODIFY_NF_OC_NOT_STRUCTURAL.get(
- nameForm.getNameOrOID(), structuralClass.getNameOrOID());
- throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message);
- }
if (structuralClass.isObsolete())
{
LocalizableMessage message = ERR_SCHEMA_MODIFY_NF_OC_OBSOLETE.get(
@@ -1732,13 +1593,7 @@
for (AttributeType at : nameForm.getRequiredAttributes())
{
- if (! schema.hasAttributeType(at.getOID()))
- {
- LocalizableMessage message = ERR_SCHEMA_MODIFY_NF_UNDEFINED_REQUIRED_ATTR.get(
- nameForm.getNameOrOID(), at.getNameOrOID());
- throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message);
- }
- else if (at.isObsolete())
+ if (at.isObsolete())
{
LocalizableMessage message = ERR_SCHEMA_MODIFY_NF_OBSOLETE_REQUIRED_ATTR.get(
nameForm.getNameOrOID(), at.getNameOrOID());
@@ -1748,13 +1603,7 @@
for (AttributeType at : nameForm.getOptionalAttributes())
{
- if (! schema.hasAttributeType(at.getOID()))
- {
- LocalizableMessage message = ERR_SCHEMA_MODIFY_NF_UNDEFINED_OPTIONAL_ATTR.get(
- nameForm.getNameOrOID(), at.getNameOrOID());
- throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message);
- }
- else if (at.isObsolete())
+ if (at.isObsolete())
{
LocalizableMessage message = ERR_SCHEMA_MODIFY_NF_OBSOLETE_OPTIONAL_ATTR.get(
nameForm.getNameOrOID(), at.getNameOrOID());
@@ -1764,17 +1613,19 @@
// If there is no existing class, then we're adding a new name form.
// Otherwise, we're replacing an existing one.
- if (existingNF == null)
+ if (!schema.hasNameForm(nameForm.getNameOrOID()))
{
- schema.registerNameForm(nameForm, false);
- addNewSchemaElement(modifiedSchemaFiles, nameForm);
+ String schemaFile = addNewSchemaElement(modifiedSchemaFiles, new ServerSchemaElement(nameForm));
+ schema.registerNameForm(nameForm, schemaFile, false);
}
else
{
+ NameForm existingNF = schema.getNameForm(nameForm.getNameOrOID());
schema.deregisterNameForm(existingNF);
- schema.registerNameForm(nameForm, false);
+ String schemaFile = replaceExistingSchemaElement(
+ modifiedSchemaFiles, new ServerSchemaElement(nameForm), new ServerSchemaElement(existingNF));
+ schema.registerNameForm(nameForm, schemaFile, false);
schema.rebuildDependentElements(existingNF);
- replaceExistingSchemaElement(modifiedSchemaFiles, nameForm, existingNF);
}
}
@@ -1809,16 +1660,14 @@
Set<String> modifiedSchemaFiles)
throws DirectoryException
{
- // See if the specified name form is actually defined in the server schema.
- // If not, then fail.
- NameForm removeNF = schema.getNameForm(nameForm.getOID());
- if (removeNF == null || !removeNF.equals(nameForm))
+ if (!schema.hasNameForm(nameForm.getOID()))
{
- LocalizableMessage message = ERR_SCHEMA_MODIFY_REMOVE_NO_SUCH_NAME_FORM.get(
- nameForm.getNameOrOID());
- throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message);
+ throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM,
+ ERR_SCHEMA_MODIFY_REMOVE_NO_SUCH_NAME_FORM.get(nameForm.getNameOrOID()));
}
+ NameForm removeNF = schema.getNameForm(nameForm.getOID());
+
// See if there is another modification later to add the name form back
// into the schema. If so, then it's a replace and we should ignore the
// remove because adding it back will handle the replace.
@@ -1838,7 +1687,7 @@
NameForm nf;
try
{
- nf = NameFormSyntax.decodeNameForm(v, schema, true);
+ nf = schema.parseNameForm(v.toString());
}
catch (DirectoryException de)
{
@@ -1859,8 +1708,7 @@
}
}
- // Make sure that the name form isn't referenced by any DIT structure
- // rule.
+ // Make sure that the name form isn't referenced by any DIT structure rule.
DITStructureRule dsr = schema.getDITStructureRule(removeNF);
if (dsr != null)
{
@@ -1869,8 +1717,7 @@
throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message);
}
- // If we've gotten here, then it's OK to remove the name form from the
- // schema.
+ // If we've gotten here, then it's OK to remove the name form from the schema.
schema.deregisterNameForm(removeNF);
String schemaFile = getSchemaFile(removeNF);
if (schemaFile != null)
@@ -2635,7 +2482,7 @@
values = new LinkedHashSet<>();
for (AttributeType at : schema.getAttributeTypes())
{
- String atSchemaFile = new SomeSchemaElement(at).getSchemaFile();
+ String atSchemaFile = new ServerSchemaElement(at).getSchemaFile();
if (schemaFile.equals(atSchemaFile))
{
addAttrTypeToSchemaFile(schema, schemaFile, at, values, addedTypes, 0);
@@ -2674,14 +2521,11 @@
// is no hierarchical relationship between name forms, we don't need to
// worry about ordering.
values = new LinkedHashSet<>();
- for (List<NameForm> forms : schema.getNameFormsByObjectClass().values())
+ for (NameForm nf : schema.getNameForms())
{
- for(NameForm nf : forms)
+ if (schemaFile.equals(getSchemaFile(nf)))
{
- if (schemaFile.equals(getSchemaFile(nf)))
- {
- values.add(ByteString.valueOfUtf8(nf.toString()));
- }
+ values.add(ByteString.valueOfUtf8(nf.toString()));
}
}
@@ -2811,7 +2655,7 @@
AttributeType superiorType = attributeType.getSuperiorType();
if (superiorType != null &&
- schemaFile.equals(new SomeSchemaElement(attributeType).getSchemaFile()) &&
+ schemaFile.equals(new ServerSchemaElement(attributeType).getSchemaFile()) &&
!addedTypes.contains(superiorType))
{
addAttrTypeToSchemaFile(schema, schemaFile, superiorType, values,
@@ -3345,7 +3189,7 @@
{
// Parse the attribute type.
AttributeType attrType = schema.parseAttributeType(v.toString());
- String schemaFile = new SomeSchemaElement(attrType).getSchemaFile();
+ String schemaFile = new ServerSchemaElement(attrType).getSchemaFile();
if (CONFIG_SCHEMA_ELEMENTS_FILE.equals(schemaFile))
{
// Don't import the file containing the definitions of the
--
Gitblit v1.10.0