blob: 8fdebef6ee5613f472b34de4b0243403e56a033f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.api.ldap.model.schema.registries;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.directory.api.i18n.I18n;
import org.apache.directory.api.ldap.model.constants.MetaSchemaConstants;
import org.apache.directory.api.ldap.model.constants.SchemaConstants;
import org.apache.directory.api.ldap.model.entry.Attribute;
import org.apache.directory.api.ldap.model.entry.Entry;
import org.apache.directory.api.ldap.model.entry.Value;
import org.apache.directory.api.ldap.model.exception.LdapException;
import org.apache.directory.api.ldap.model.schema.SchemaManager;
import org.apache.directory.api.util.StringConstants;
import org.apache.directory.api.util.Strings;
/**
* An abstract class with a utility method and setListener() implemented.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public abstract class AbstractSchemaLoader implements SchemaLoader
{
/**
* A map of all available schema names to schema objects. This map is
* populated when this class is created with all the schemas present in
* the LDIF based schema repository.
*/
protected final Map<String, Schema> schemaMap = new LowerCaseKeyMap();
/** The flag that tells about the SchemaLoader mode : relaxed or strict */
private boolean relaxed;
/**
* {@inheritDoc}
*/
@Override
public final Collection<Schema> getAllEnabled()
{
Collection<Schema> enabledSchemas = new ArrayList<>();
for ( Schema schema : schemaMap.values() )
{
if ( schema.isEnabled() )
{
enabledSchemas.add( schema );
}
}
return enabledSchemas;
}
/**
* {@inheritDoc}
*/
@Override
public final Collection<Schema> getAllSchemas()
{
return schemaMap.values();
}
/**
* {@inheritDoc}
*/
@Override
public Schema getSchema( String schemaName )
{
return schemaMap.get( Strings.toLowerCaseAscii( schemaName ) );
}
/**
* {@inheritDoc}
*/
@Override
public void addSchema( Schema schema )
{
schemaMap.put( schema.getSchemaName(), schema );
}
/**
* {@inheritDoc}
*/
@Override
public void removeSchema( Schema schema )
{
schemaMap.remove( Strings.toLowerCaseAscii( schema.getSchemaName() ) );
}
/**
* Gets the schema.
*
* @param entry the entry
* @return the schema
* @throws LdapException the exception
*/
protected Schema getSchema( Entry entry ) throws LdapException
{
if ( entry == null )
{
throw new IllegalArgumentException( I18n.err( I18n.ERR_13727_ENTRY_CANNOT_BE_NULL ) );
}
Attribute objectClasses = entry.get( SchemaConstants.OBJECT_CLASS_AT );
boolean isSchema = false;
for ( Value value : objectClasses )
{
if ( MetaSchemaConstants.META_SCHEMA_OC.equalsIgnoreCase( value.getString() ) )
{
isSchema = true;
break;
}
}
if ( !isSchema )
{
return null;
}
String name;
String owner;
String[] dependencies = StringConstants.EMPTY_STRINGS;
boolean isDisabled = false;
if ( entry.get( SchemaConstants.CN_AT ) == null )
{
throw new IllegalArgumentException( I18n.err( I18n.ERR_13728_ENTRY_INVALID_CN ) );
}
name = entry.get( SchemaConstants.CN_AT ).getString();
Attribute creatorsName = entry.get( SchemaConstants.CREATORS_NAME_AT );
if ( creatorsName == null )
{
owner = null;
}
else
{
owner = creatorsName.getString();
}
if ( entry.get( MetaSchemaConstants.M_DISABLED_AT ) != null )
{
String value = entry.get( MetaSchemaConstants.M_DISABLED_AT ).getString();
value = Strings.upperCase( value );
isDisabled = "TRUE".equals( value );
}
if ( entry.get( MetaSchemaConstants.M_DEPENDENCIES_AT ) != null )
{
Set<String> depsSet = new HashSet<>();
Attribute depsAttr = entry.get( MetaSchemaConstants.M_DEPENDENCIES_AT );
for ( Value value : depsAttr )
{
depsSet.add( value.getString() );
}
dependencies = depsSet.toArray( StringConstants.EMPTY_STRINGS );
}
return new DefaultSchema( this, name, owner, dependencies, isDisabled );
}
private Schema[] buildSchemaArray( String... schemaNames )
{
Schema[] schemas = new Schema[schemaNames.length];
int pos = 0;
for ( String schemaName : schemaNames )
{
schemas[pos++] = getSchema( schemaName );
}
return schemas;
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadAttributeTypes( String... schemaNames ) throws LdapException, IOException
{
if ( schemaNames == null )
{
return new ArrayList<>();
}
return loadAttributeTypes( buildSchemaArray( schemaNames ) );
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadComparators( String... schemaNames ) throws LdapException, IOException
{
if ( schemaNames == null )
{
return new ArrayList<>();
}
return loadComparators( buildSchemaArray( schemaNames ) );
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadDitContentRules( String... schemaNames ) throws LdapException, IOException
{
if ( schemaNames == null )
{
return new ArrayList<>();
}
return loadDitContentRules( buildSchemaArray( schemaNames ) );
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadDitStructureRules( String... schemaNames ) throws LdapException, IOException
{
if ( schemaNames == null )
{
return new ArrayList<>();
}
return loadDitStructureRules( buildSchemaArray( schemaNames ) );
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadMatchingRules( String... schemaNames ) throws LdapException, IOException
{
if ( schemaNames == null )
{
return new ArrayList<>();
}
return loadMatchingRules( buildSchemaArray( schemaNames ) );
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadMatchingRuleUses( String... schemaNames ) throws LdapException, IOException
{
if ( schemaNames == null )
{
return new ArrayList<>();
}
return loadMatchingRuleUses( buildSchemaArray( schemaNames ) );
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadNameForms( String... schemaNames ) throws LdapException, IOException
{
if ( schemaNames == null )
{
return new ArrayList<>();
}
return loadNameForms( buildSchemaArray( schemaNames ) );
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadNormalizers( String... schemaNames ) throws LdapException, IOException
{
if ( schemaNames == null )
{
return new ArrayList<>();
}
return loadNormalizers( buildSchemaArray( schemaNames ) );
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadObjectClasses( String... schemaNames ) throws LdapException, IOException
{
if ( schemaNames == null )
{
return new ArrayList<>();
}
return loadObjectClasses( buildSchemaArray( schemaNames ) );
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadSyntaxes( String... schemaNames ) throws LdapException, IOException
{
if ( schemaNames == null )
{
return new ArrayList<>();
}
return loadSyntaxes( buildSchemaArray( schemaNames ) );
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadSyntaxCheckers( String... schemaNames ) throws LdapException, IOException
{
if ( schemaNames == null )
{
return new ArrayList<>();
}
return loadSyntaxCheckers( buildSchemaArray( schemaNames ) );
}
/**
* {@inheritDoc}
*/
@Override
public boolean isRelaxed()
{
return relaxed == SchemaManager.RELAXED;
}
/**
* {@inheritDoc}
*/
@Override
public boolean isStrict()
{
return relaxed == SchemaManager.STRICT;
}
/**
* {@inheritDoc}
*/
@Override
public void setRelaxed( boolean relaxed )
{
this.relaxed = relaxed;
}
}