| | |
| | | import org.opends.server.schema.DITContentRuleSyntax; |
| | | import org.opends.server.schema.DITStructureRuleSyntax; |
| | | import org.opends.server.schema.GeneralizedTimeSyntax; |
| | | import org.opends.server.schema.LDAPSyntaxDescriptionSyntax; |
| | | import org.opends.server.schema.MatchingRuleUseSyntax; |
| | | import org.opends.server.schema.NameFormSyntax; |
| | | import org.opends.server.schema.ObjectClassSyntax; |
| | |
| | | addMatchingRuleUse(mru, newSchema, modifiedSchemaFiles); |
| | | } |
| | | } |
| | | else if(at.equals(ldapSyntaxesType)) |
| | | { |
| | | for(AttributeValue v : a) |
| | | { |
| | | LDAPSyntaxDescription lsd = null; |
| | | try |
| | | { |
| | | lsd = LDAPSyntaxDescriptionSyntax.decodeLDAPSyntax( |
| | | v.getValue(), |
| | | newSchema, false); |
| | | } |
| | | catch(DirectoryException de) |
| | | { |
| | | if (debugEnabled()) |
| | | { |
| | | TRACER.debugCaught(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | Message message = |
| | | ERR_SCHEMA_MODIFY_CANNOT_DECODE_LDAP_SYNTAX.get( |
| | | v.getValue().toString(), de.getMessageObject()); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message, |
| | | de); |
| | | } |
| | | addLdapSyntaxDescription(lsd,newSchema,modifiedSchemaFiles); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | Message message = |
| | |
| | | modifiedSchemaFiles); |
| | | } |
| | | } |
| | | else if (at.equals(ldapSyntaxesType)) |
| | | { |
| | | for(AttributeValue v : a) |
| | | { |
| | | LDAPSyntaxDescription lsd = null; |
| | | try |
| | | { |
| | | lsd = LDAPSyntaxDescriptionSyntax.decodeLDAPSyntax( |
| | | v.getValue(), |
| | | newSchema, false); |
| | | } |
| | | catch(DirectoryException de) |
| | | { |
| | | if (debugEnabled()) |
| | | { |
| | | TRACER.debugCaught(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | Message message = |
| | | ERR_SCHEMA_MODIFY_CANNOT_DECODE_LDAP_SYNTAX.get( |
| | | v.getValue().toString(), de.getMessageObject()); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message, |
| | | de); |
| | | } |
| | | removeLdapSyntaxDescription(lsd,newSchema,modifiedSchemaFiles); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | Message message = |
| | |
| | | |
| | | |
| | | /** |
| | | * Handles all processing required for adding the provided ldap syntax |
| | | * description to the given schema, replacing an existing ldap syntax |
| | | * description if necessary, and ensuring all other metadata is properly |
| | | * updated. |
| | | * |
| | | * @param ldapSyntaxDesc The ldap syntax description to add or replace in |
| | | * the server schema. |
| | | * @param schema The schema to which the name form should be |
| | | * added. |
| | | * @param modifiedSchemaFiles The names of the schema files containing |
| | | * schema elements that have been updated as part |
| | | * of the schema modification. |
| | | * |
| | | * @throws DirectoryException If a problem occurs while attempting to add |
| | | * the provided ldap syntax description to the |
| | | * server schema. |
| | | */ |
| | | private void addLdapSyntaxDescription(LDAPSyntaxDescription ldapSyntaxDesc, |
| | | Schema schema, |
| | | Set<String> modifiedSchemaFiles) |
| | | throws DirectoryException |
| | | { |
| | | //Check if there is an existing syntax with this oid. |
| | | String oid = ldapSyntaxDesc.getLdapSyntaxDescriptionSyntax().getOID(); |
| | | |
| | | // We allow only unimplemented syntaxes to be substituted. |
| | | if(schema.getSyntax(oid) !=null) |
| | | { |
| | | Message message = ERR_ATTR_SYNTAX_INVALID_SUBSTITUTION_SYNTAX.get( |
| | | ldapSyntaxDesc.getDefinition(),oid); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | | message); |
| | | } |
| | | |
| | | LDAPSyntaxDescription existingLSD = |
| | | schema.getLdapSyntaxDescription(oid); |
| | | |
| | | // If there is no existing lsd, then we're adding a new ldapsyntax. |
| | | // Otherwise, we're replacing an existing one. |
| | | if (existingLSD == null) |
| | | { |
| | | schema.registerLdapSyntaxDescription(ldapSyntaxDesc, false); |
| | | String schemaFile = ldapSyntaxDesc.getSchemaFile(); |
| | | if ((schemaFile == null) || (schemaFile.length() == 0)) |
| | | { |
| | | schemaFile = FILE_USER_SCHEMA_ELEMENTS; |
| | | ldapSyntaxDesc.setSchemaFile(schemaFile); |
| | | } |
| | | |
| | | modifiedSchemaFiles.add(schemaFile); |
| | | } |
| | | else |
| | | { |
| | | schema.deregisterLdapSyntaxDescription(existingLSD); |
| | | schema.registerLdapSyntaxDescription(ldapSyntaxDesc, false); |
| | | schema.rebuildDependentElements(existingLSD); |
| | | |
| | | if ((ldapSyntaxDesc.getSchemaFile() == null) || |
| | | (ldapSyntaxDesc.getSchemaFile().length() == 0)) |
| | | { |
| | | String schemaFile = ldapSyntaxDesc.getSchemaFile(); |
| | | if ((schemaFile == null) || (schemaFile.length() == 0)) |
| | | { |
| | | schemaFile = FILE_USER_SCHEMA_ELEMENTS; |
| | | } |
| | | |
| | | ldapSyntaxDesc.setSchemaFile(schemaFile); |
| | | modifiedSchemaFiles.add(schemaFile); |
| | | } |
| | | else |
| | | { |
| | | String newSchemaFile = ldapSyntaxDesc.getSchemaFile(); |
| | | String oldSchemaFile = existingLSD.getSchemaFile(); |
| | | if ((oldSchemaFile == null) || oldSchemaFile.equals(newSchemaFile)) |
| | | { |
| | | modifiedSchemaFiles.add(newSchemaFile); |
| | | } |
| | | else |
| | | { |
| | | modifiedSchemaFiles.add(newSchemaFile); |
| | | modifiedSchemaFiles.add(oldSchemaFile); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | //Gets rid of the ldap syntax description. |
| | | private void removeLdapSyntaxDescription(LDAPSyntaxDescription ldapSyntaxDesc, |
| | | Schema schema, |
| | | Set<String> modifiedSchemaFiles) |
| | | throws DirectoryException |
| | | { |
| | | //See if the specified ldap syntax description is actually defined in the |
| | | //server schema. If not, then fail. Note that we are checking only the |
| | | //real part of the ldapsyntaxes attribute. A virtual value is not searched |
| | | // and hence never deleted. |
| | | String oid = ldapSyntaxDesc.getLdapSyntaxDescriptionSyntax().getOID(); |
| | | LDAPSyntaxDescription removeLSD = schema.getLdapSyntaxDescription(oid); |
| | | |
| | | if ((removeLSD == null) || (! removeLSD.equals(ldapSyntaxDesc))) |
| | | { |
| | | Message message = |
| | | ERR_SCHEMA_MODIFY_REMOVE_NO_SUCH_LSD.get(oid); |
| | | throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message); |
| | | } |
| | | |
| | | schema.deregisterLdapSyntaxDescription(removeLSD); |
| | | String schemaFile = removeLSD.getSchemaFile(); |
| | | if (schemaFile != null) |
| | | { |
| | | modifiedSchemaFiles.add(schemaFile); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Creates an empty entry that may be used as the basis for a new schema file. |
| | | * |
| | | * @return An empty entry that may be used as the basis for a new schema |
| | |
| | | schemaEntry.putAttribute(matchingRuleUsesType, attrList); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Add all of the ldap syntax descriptions to the schema entry. We do |
| | | * this only for the real part of the ldapsyntaxes attribute. The real part |
| | | * is read and write to/from the schema files. |
| | | */ |
| | | values = new LinkedHashSet<AttributeValue>(); |
| | | for (LDAPSyntaxDescription ldapSyntax : |
| | | schema.getLdapSyntaxDescriptions().values()) |
| | | { |
| | | if(schemaFile.equals(ldapSyntax.getSchemaFile())) |
| | | { |
| | | values.add(AttributeValues.create(ldapSyntaxesType, |
| | | ldapSyntax.getDefinition())); |
| | | } |
| | | } |
| | | |
| | | if (! values.isEmpty()) |
| | | { |
| | | ArrayList<Attribute> attrList = new ArrayList<Attribute>(1); |
| | | AttributeBuilder builder = new AttributeBuilder(ldapSyntaxesType); |
| | | builder.addAll(values); |
| | | attrList.add(builder.toAttribute()); |
| | | schemaEntry.putAttribute(attributeTypesType, attrList); |
| | | } |
| | | |
| | | |
| | | if (schemaFile.equals(FILE_USER_SCHEMA_ELEMENTS)) |
| | | { |
| | | Map<String, Attribute> attributes = schema.getExtraAttributes(); |