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;
}
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();
}
}
}
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);
}
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;
}
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;
}
Aggregations