Search in sources :

Example 51 with Schema

use of org.apache.directory.api.ldap.model.schema.registries.Schema in project directory-ldap-api by apache.

the class DefaultSchemaManager method loadWithDeps.

/**
 * {@inheritDoc}
 */
@Override
public boolean loadWithDeps(Schema... schemas) throws LdapException {
    boolean loaded = false;
    // Reset the errors if not null
    if (errors != null) {
        errors.clear();
    }
    // Work on a cloned and relaxed registries
    Registries clonedRegistries = cloneRegistries();
    clonedRegistries.setRelaxed();
    // Load the schemas
    for (Schema schema : schemas) {
        loadDepsFirst(clonedRegistries, schema);
    }
    // Build the cross references
    errors = clonedRegistries.buildReferences();
    if (errors.isEmpty()) {
        // Ok no errors. Check the registries now
        errors = clonedRegistries.checkRefInteg();
        if (errors.isEmpty()) {
            // We are golden : let's apply the schema in the real registries
            registries = clonedRegistries;
            registries.setStrict();
            loaded = true;
        }
    } else if (isStrict()) {
        // clear the cloned registries
        clonedRegistries.clear();
    } else {
        // Relaxed mode
        registries = clonedRegistries;
        registries.setRelaxed();
        loaded = true;
    }
    return loaded;
}
Also used : Schema(org.apache.directory.api.ldap.model.schema.registries.Schema) Registries(org.apache.directory.api.ldap.model.schema.registries.Registries)

Example 52 with Schema

use of org.apache.directory.api.ldap.model.schema.registries.Schema in project directory-ldap-api by apache.

the class DefaultSchemaManager method add.

// -----------------------------------------------------------------------------------
// SchemaObject operations
// -----------------------------------------------------------------------------------
/**
 * {@inheritDoc}
 */
@Override
public boolean add(SchemaObject schemaObject) throws LdapException {
    // First, clear the errors
    errors.clear();
    // Clone the schemaObject
    SchemaObject copy = copy(schemaObject);
    if (copy == null) {
        return false;
    }
    if (registries.isRelaxed()) {
        // Apply the addition right away
        registries.add(errors, copy, true);
        return errors.isEmpty();
    } else {
        // The new schemaObject's OID must not already exist
        if (checkOidExist(copy)) {
            LdapSchemaException ldapSchemaException = new LdapSchemaException(LdapSchemaExceptionCodes.OID_ALREADY_REGISTERED, I18n.err(I18n.ERR_16036_OID_NOT_UNIQUE, schemaObject.getOid()));
            ldapSchemaException.setSourceObject(schemaObject);
            errors.add(ldapSchemaException);
            return false;
        }
        // Build the new AttributeType from the given entry
        String schemaName = getSchemaName(copy);
        if (schemaName == null) {
            // The schema associated with the SchemaaObject does not exist. This is not valid.
            LdapSchemaException ldapSchemaException = new LdapSchemaException(LdapSchemaExceptionCodes.NONEXISTENT_SCHEMA, I18n.err(I18n.ERR_16037_NON_EXISTING_SCHEMA, schemaObject.getOid(), copy.getSchemaName()));
            ldapSchemaException.setSourceObject(schemaObject);
            ldapSchemaException.setRelatedId(copy.getSchemaName());
            errors.add(ldapSchemaException);
            return false;
        }
        // At this point, the constructed AttributeType has not been checked against the
        // existing Registries. It may be broken (missing SUP, or such), it will be checked
        // there, if the schema and the AttributeType are both enabled.
        Schema schema = getLoadedSchema(schemaName);
        if (schema == null) {
            // The SchemaObject must be associated with an existing schema
            String msg = I18n.err(I18n.ERR_16038_NOT_ASSOCIATED_TO_A_SCHEMA, copy.getOid());
            LOG.info(msg);
            Throwable error = new LdapProtocolErrorException(msg);
            errors.add(error);
            return false;
        }
        if (schema.isEnabled() && copy.isEnabled()) {
            // As we may break the registries, work on a cloned registries
            Registries clonedRegistries = null;
            try {
                clonedRegistries = registries.clone();
            } catch (CloneNotSupportedException cnse) {
                throw new LdapOtherException(cnse.getMessage(), cnse);
            }
            // Inject the new SchemaObject in the cloned registries
            clonedRegistries.add(errors, copy, true);
            // Remove the cloned registries
            clonedRegistries.clear();
            // If we didn't get any error, apply the addition to the real retistries
            if (errors.isEmpty()) {
                // Copy again as the clonedRegistries clear has removed the previous copy
                copy = copy(schemaObject);
                // Apply the addition to the real registries
                registries.add(errors, copy, true);
                LOG.debug(I18n.msg(I18n.MSG_16019_ENABLED_SCHEMA_ADDED, copy.getName(), schemaName));
                return true;
            } else {
                // We have some error : reject the addition and get out
                LOG.info(I18n.msg(I18n.MSG_16020_CANNOT_LOAD_SCHEMAOBJECT, copy.getOid(), Strings.listToString(errors)));
                return false;
            }
        } else {
            // At least, we register the OID in the globalOidRegistry, and associates it with the
            // schema
            registries.associateWithSchema(errors, copy);
            LOG.debug(I18n.msg(I18n.MSG_16021_ADDED_INTO_DISABLED_SCHEMA, copy.getName(), schemaName));
            return errors.isEmpty();
        }
    }
}
Also used : SchemaObject(org.apache.directory.api.ldap.model.schema.SchemaObject) LoadableSchemaObject(org.apache.directory.api.ldap.model.schema.LoadableSchemaObject) LdapProtocolErrorException(org.apache.directory.api.ldap.model.exception.LdapProtocolErrorException) Schema(org.apache.directory.api.ldap.model.schema.registries.Schema) LdapSchemaException(org.apache.directory.api.ldap.model.exception.LdapSchemaException) Registries(org.apache.directory.api.ldap.model.schema.registries.Registries) LdapOtherException(org.apache.directory.api.ldap.model.exception.LdapOtherException)

Example 53 with Schema

use of org.apache.directory.api.ldap.model.schema.registries.Schema in project directory-ldap-api by apache.

the class DefaultSchemaManager method loadAllEnabledRelaxed.

/**
 * {@inheritDoc}
 */
@Override
public boolean loadAllEnabledRelaxed() throws LdapException {
    Schema[] enabledSchemas = new Schema[schemaMap.size()];
    int i = 0;
    for (Schema schema : schemaMap.values()) {
        if (schema.isEnabled()) {
            enabledSchemas[i++] = schema;
        }
    }
    return loadWithDepsRelaxed(enabledSchemas);
}
Also used : Schema(org.apache.directory.api.ldap.model.schema.registries.Schema)

Example 54 with Schema

use of org.apache.directory.api.ldap.model.schema.registries.Schema in project directory-ldap-api by apache.

the class DefaultSchemaManager method load.

/**
 * {@inheritDoc}
 */
@Override
public boolean load(Schema... schemas) throws LdapException {
    if (schemas.length == 0) {
        return true;
    }
    boolean loaded = false;
    // Reset the errors if not null
    if (errors != null) {
        errors.clear();
    }
    // Work on a cloned and relaxed registries
    Registries clonedRegistries = cloneRegistries();
    clonedRegistries.setRelaxed();
    // Load the schemas
    for (Schema schema : schemas) {
        boolean singleSchemaLoaded = load(clonedRegistries, schema);
        // return false if the schema was not loaded in the first place
        if (!singleSchemaLoaded) {
            return false;
        }
    }
    // Build the cross references
    errors = clonedRegistries.buildReferences();
    if (errors.isEmpty()) {
        // Ok no errors. Check the registries now
        errors = clonedRegistries.checkRefInteg();
        if (errors.isEmpty()) {
            // We are golden : let's apply the schema in the real registries
            registries.setRelaxed();
            // Load the schemas
            for (Schema schema : schemas) {
                load(registries, schema);
                // Update the schema dependences if needed
                if (schema.getDependencies() != null) {
                    for (String dep : schema.getDependencies()) {
                        Set<String> deps = schemaDependencies.get(dep);
                        if (deps == null) {
                            deps = new HashSet<>();
                            deps.add(schema.getSchemaName());
                        }
                        // Replace the dependences
                        schemaDependencies.put(dep, deps);
                    }
                }
                // add the schema to the SchemaMap
                schemaMap.put(schema.getSchemaName(), schema);
            }
            // Build the cross references
            errors = registries.buildReferences();
            registries.setStrict();
            loaded = true;
        }
    }
    // clear the cloned registries
    clonedRegistries.clear();
    return loaded;
}
Also used : Schema(org.apache.directory.api.ldap.model.schema.registries.Schema) Registries(org.apache.directory.api.ldap.model.schema.registries.Registries)

Example 55 with Schema

use of org.apache.directory.api.ldap.model.schema.registries.Schema in project directory-ldap-api by apache.

the class DefaultSchemaManager method unload.

/**
 * {@inheritDoc}
 */
@Override
public boolean unload(Schema... schemas) throws LdapException {
    boolean unloaded = false;
    // Reset the errors if not null
    if (errors != null) {
        errors.clear();
    }
    // Work on a cloned and relaxed registries
    Registries clonedRegistries = cloneRegistries();
    clonedRegistries.setRelaxed();
    // Load the schemas
    for (Schema schema : schemas) {
        unload(clonedRegistries, schema);
    }
    // Build the cross references
    errors = clonedRegistries.buildReferences();
    if (errors.isEmpty()) {
        // Ok no errors. Check the registries now
        errors = clonedRegistries.checkRefInteg();
        if (errors.isEmpty()) {
            // We are golden : let's apply the schema in the real registries
            registries.setRelaxed();
            // Load the schemas
            for (Schema schema : schemas) {
                unload(registries, schema);
                // Update the schema dependences
                for (String dep : schema.getDependencies()) {
                    Set<String> deps = schemaDependencies.get(dep);
                    if (deps != null) {
                        deps.remove(schema.getSchemaName());
                    }
                }
                schemaMap.remove(schema.getSchemaName());
            }
            // Build the cross references
            errors = registries.buildReferences();
            registries.setStrict();
            unloaded = true;
        }
    }
    // clear the cloned registries
    clonedRegistries.clear();
    return unloaded;
}
Also used : Schema(org.apache.directory.api.ldap.model.schema.registries.Schema) Registries(org.apache.directory.api.ldap.model.schema.registries.Registries)

Aggregations

Schema (org.apache.directory.api.ldap.model.schema.registries.Schema)74 ArrayList (java.util.ArrayList)34 Entry (org.apache.directory.api.ldap.model.entry.Entry)34 DefaultSchema (org.apache.directory.api.ldap.model.schema.registries.DefaultSchema)28 LdifEntry (org.apache.directory.api.ldap.model.ldif.LdifEntry)26 LdifReader (org.apache.directory.api.ldap.model.ldif.LdifReader)25 File (java.io.File)13 SchemaObject (org.apache.directory.api.ldap.model.schema.SchemaObject)13 SchemaObjectWrapper (org.apache.directory.api.ldap.model.schema.SchemaObjectWrapper)13 URL (java.net.URL)12 LdapUnwillingToPerformException (org.apache.directory.api.ldap.model.exception.LdapUnwillingToPerformException)12 DefaultEntry (org.apache.directory.api.ldap.model.entry.DefaultEntry)11 Attribute (org.apache.directory.api.ldap.model.entry.Attribute)9 DefaultAttribute (org.apache.directory.api.ldap.model.entry.DefaultAttribute)9 Registries (org.apache.directory.api.ldap.model.schema.registries.Registries)9 AttributesFactory (org.apache.directory.api.ldap.model.schema.AttributesFactory)8 LdapException (org.apache.directory.api.ldap.model.exception.LdapException)7 DefaultSchemaManager (org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager)7 Test (org.junit.Test)7 SchemaManager (org.apache.directory.api.ldap.model.schema.SchemaManager)6