blob: e59677a0db2f0c1de8e5b6210621b7f8e5c9fe47 [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.schema.loader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.directory.api.i18n.I18n;
import org.apache.directory.api.ldap.model.constants.SchemaConstants;
import org.apache.directory.api.ldap.model.entry.Entry;
import org.apache.directory.api.ldap.model.exception.LdapException;
import org.apache.directory.api.ldap.model.ldif.LdifEntry;
import org.apache.directory.api.ldap.model.ldif.LdifReader;
import org.apache.directory.api.ldap.model.schema.registries.AbstractSchemaLoader;
import org.apache.directory.api.ldap.model.schema.registries.Schema;
import org.apache.directory.api.util.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Loads schema data from LDIF files containing entries representing schema
* objects, using the meta schema format.
*
* This class is used only for tests.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class LdifSchemaLoader extends AbstractSchemaLoader
{
/** ldif file extension used */
private static final String LDIF_EXT = "ldif";
/** ou=schema LDIF file name */
private static final String OU_SCHEMA_LDIF = "ou=schema." + LDIF_EXT;
/** static class logger */
private static final Logger LOG = LoggerFactory.getLogger( LdifSchemaLoader.class );
/** directory containing the schema LDIF file for ou=schema */
private final File baseDirectory;
/** a filter for listing all the LDIF files within a directory */
private final FilenameFilter ldifFilter = new FilenameFilter()
{
@Override
public boolean accept( File file, String name )
{
return name.endsWith( LDIF_EXT );
}
};
/**
* Creates a new LDIF based SchemaLoader. The constructor checks to make
* sure the supplied base directory exists and contains a schema.ldif file
* and if not complains about it.
*
* @param baseDirectory the schema LDIF base directory
* @throws LdapException if the base directory does not exist or does not
* a valid schema.ldif file
* @throws IOException If we can't load the schema
*/
public LdifSchemaLoader( File baseDirectory ) throws LdapException, IOException
{
this.baseDirectory = baseDirectory;
if ( !baseDirectory.exists() )
{
String msg = I18n.err( I18n.ERR_16046_BASE_DIR_DOES_NOT_EXIST, baseDirectory.getAbsolutePath() );
LOG.error( msg );
throw new IllegalArgumentException( msg );
}
File schemaLdif = new File( baseDirectory, OU_SCHEMA_LDIF );
if ( !schemaLdif.exists() )
{
String msg = I18n.err( I18n.ERR_16010_NO_SHEMA_FILE, schemaLdif.getAbsolutePath() );
LOG.error( msg );
throw new FileNotFoundException( msg );
}
if ( LOG.isDebugEnabled() )
{
LOG.debug( I18n.msg( I18n.MSG_16010_USING_BASE_SCHEMA_DIR, baseDirectory ) );
}
initializeSchemas();
}
/**
* Scans for LDIF files just describing the various schema contained in
* the schema repository.
*
* @throws LdapException if the schemas can't be initialized
* @throws IOException If teh schema can't be read
*/
private void initializeSchemas() throws LdapException, IOException
{
if ( LOG.isDebugEnabled() )
{
LOG.debug( I18n.msg( I18n.MSG_16006_INITIALIZING_SCHEMA ) );
}
File schemaDirectory = new File( baseDirectory, SchemaConstants.OU_SCHEMA );
String[] ldifFiles = schemaDirectory.list( ldifFilter );
if ( ldifFiles != null )
{
for ( String ldifFile : ldifFiles )
{
File file = new File( schemaDirectory, ldifFile );
try ( LdifReader reader = new LdifReader( file ) )
{
LdifEntry entry = reader.next();
Schema schema = getSchema( entry.getEntry() );
if ( schema == null )
{
// The entry was not a schema, skip it
continue;
}
schemaMap.put( schema.getSchemaName(), schema );
if ( LOG.isDebugEnabled() )
{
LOG.debug( I18n.msg( I18n.MSG_16007_SCHEMA_INITIALIZED, schema ) );
}
}
catch ( LdapException e )
{
LOG.error( I18n.err( I18n.ERR_16009_LDIF_LOAD_FAIL, ldifFile ), e );
throw e;
}
}
}
}
/**
* Utility method to get the file for a schema directory.
*
* @param schema the schema to get the file for
* @return the file for the specific schema directory
*/
private File getSchemaDirectory( Schema schema )
{
return new File( new File( baseDirectory, SchemaConstants.OU_SCHEMA ), "cn="
+ Strings.lowerCase( schema.getSchemaName() ) );
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadComparators( Schema... schemas ) throws LdapException, IOException
{
List<Entry> comparatorList = new ArrayList<>();
if ( schemas == null )
{
return comparatorList;
}
for ( Schema schema : schemas )
{
File comparatorsDirectory = new File( getSchemaDirectory( schema ), SchemaConstants.COMPARATORS_PATH );
if ( !comparatorsDirectory.exists() )
{
return comparatorList;
}
File[] comparators = comparatorsDirectory.listFiles( ldifFilter );
if ( comparators != null )
{
for ( File ldifFile : comparators )
{
try ( LdifReader reader = new LdifReader( ldifFile ) )
{
LdifEntry entry = reader.next();
comparatorList.add( entry.getEntry() );
}
}
}
}
return comparatorList;
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadSyntaxCheckers( Schema... schemas ) throws LdapException, IOException
{
List<Entry> syntaxCheckerList = new ArrayList<>();
if ( schemas == null )
{
return syntaxCheckerList;
}
for ( Schema schema : schemas )
{
File syntaxCheckersDirectory = new File( getSchemaDirectory( schema ), SchemaConstants.SYNTAX_CHECKERS_PATH );
if ( !syntaxCheckersDirectory.exists() )
{
return syntaxCheckerList;
}
File[] syntaxCheckerFiles = syntaxCheckersDirectory.listFiles( ldifFilter );
if ( syntaxCheckerFiles != null )
{
for ( File ldifFile : syntaxCheckerFiles )
{
try ( LdifReader reader = new LdifReader( ldifFile ) )
{
LdifEntry entry = reader.next();
syntaxCheckerList.add( entry.getEntry() );
}
}
}
}
return syntaxCheckerList;
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadNormalizers( Schema... schemas ) throws LdapException, IOException
{
List<Entry> normalizerList = new ArrayList<>();
if ( schemas == null )
{
return normalizerList;
}
for ( Schema schema : schemas )
{
File normalizersDirectory = new File( getSchemaDirectory( schema ), SchemaConstants.NORMALIZERS_PATH );
if ( !normalizersDirectory.exists() )
{
return normalizerList;
}
File[] normalizerFiles = normalizersDirectory.listFiles( ldifFilter );
if ( normalizerFiles != null )
{
for ( File ldifFile : normalizerFiles )
{
try ( LdifReader reader = new LdifReader( ldifFile ) )
{
LdifEntry entry = reader.next();
normalizerList.add( entry.getEntry() );
}
}
}
}
return normalizerList;
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadMatchingRules( Schema... schemas ) throws LdapException, IOException
{
List<Entry> matchingRuleList = new ArrayList<>();
if ( schemas == null )
{
return matchingRuleList;
}
for ( Schema schema : schemas )
{
File matchingRulesDirectory = new File( getSchemaDirectory( schema ), SchemaConstants.MATCHING_RULES_PATH );
if ( !matchingRulesDirectory.exists() )
{
return matchingRuleList;
}
File[] matchingRuleFiles = matchingRulesDirectory.listFiles( ldifFilter );
if ( matchingRuleFiles != null )
{
for ( File ldifFile : matchingRuleFiles )
{
try ( LdifReader reader = new LdifReader( ldifFile ) )
{
LdifEntry entry = reader.next();
matchingRuleList.add( entry.getEntry() );
}
}
}
}
return matchingRuleList;
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadSyntaxes( Schema... schemas ) throws LdapException, IOException
{
List<Entry> syntaxList = new ArrayList<>();
if ( schemas == null )
{
return syntaxList;
}
for ( Schema schema : schemas )
{
File syntaxesDirectory = new File( getSchemaDirectory( schema ), SchemaConstants.SYNTAXES_PATH );
if ( !syntaxesDirectory.exists() )
{
return syntaxList;
}
File[] syntaxFiles = syntaxesDirectory.listFiles( ldifFilter );
if ( syntaxFiles != null )
{
for ( File ldifFile : syntaxFiles )
{
try ( LdifReader reader = new LdifReader( ldifFile ) )
{
LdifEntry entry = reader.next();
syntaxList.add( entry.getEntry() );
}
}
}
}
return syntaxList;
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadAttributeTypes( Schema... schemas ) throws LdapException, IOException
{
List<Entry> attributeTypeList = new ArrayList<>();
if ( schemas == null )
{
return attributeTypeList;
}
for ( Schema schema : schemas )
{
// check that the attributeTypes directory exists for the schema
File attributeTypesDirectory = new File( getSchemaDirectory( schema ), SchemaConstants.ATTRIBUTE_TYPES_PATH );
if ( !attributeTypesDirectory.exists() )
{
return attributeTypeList;
}
// get list of attributeType LDIF schema files in attributeTypes
File[] attributeTypeFiles = attributeTypesDirectory.listFiles( ldifFilter );
if ( attributeTypeFiles != null )
{
for ( File ldifFile : attributeTypeFiles )
{
try ( LdifReader reader = new LdifReader( ldifFile ) )
{
LdifEntry entry = reader.next();
attributeTypeList.add( entry.getEntry() );
}
}
}
}
return attributeTypeList;
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadMatchingRuleUses( Schema... schemas ) throws LdapException, IOException
{
List<Entry> matchingRuleUseList = new ArrayList<>();
if ( schemas == null )
{
return matchingRuleUseList;
}
for ( Schema schema : schemas )
{
File matchingRuleUsesDirectory = new File( getSchemaDirectory( schema ),
SchemaConstants.MATCHING_RULE_USE_PATH );
if ( !matchingRuleUsesDirectory.exists() )
{
return matchingRuleUseList;
}
File[] matchingRuleUseFiles = matchingRuleUsesDirectory.listFiles( ldifFilter );
if ( matchingRuleUseFiles != null )
{
for ( File ldifFile : matchingRuleUseFiles )
{
try ( LdifReader reader = new LdifReader( ldifFile ) )
{
LdifEntry entry = reader.next();
matchingRuleUseList.add( entry.getEntry() );
}
}
}
}
return matchingRuleUseList;
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadNameForms( Schema... schemas ) throws LdapException, IOException
{
List<Entry> nameFormList = new ArrayList<>();
if ( schemas == null )
{
return nameFormList;
}
for ( Schema schema : schemas )
{
File nameFormsDirectory = new File( getSchemaDirectory( schema ), SchemaConstants.NAME_FORMS_PATH );
if ( !nameFormsDirectory.exists() )
{
return nameFormList;
}
File[] nameFormFiles = nameFormsDirectory.listFiles( ldifFilter );
if ( nameFormFiles != null )
{
for ( File ldifFile : nameFormFiles )
{
try ( LdifReader reader = new LdifReader( ldifFile ) )
{
LdifEntry entry = reader.next();
nameFormList.add( entry.getEntry() );
}
}
}
}
return nameFormList;
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadDitContentRules( Schema... schemas ) throws LdapException, IOException
{
List<Entry> ditContentRuleList = new ArrayList<>();
if ( schemas == null )
{
return ditContentRuleList;
}
for ( Schema schema : schemas )
{
File ditContentRulesDirectory = new File( getSchemaDirectory( schema ),
SchemaConstants.DIT_CONTENT_RULES_PATH );
if ( !ditContentRulesDirectory.exists() )
{
return ditContentRuleList;
}
File[] ditContentRuleFiles = ditContentRulesDirectory.listFiles( ldifFilter );
if ( ditContentRuleFiles != null )
{
for ( File ldifFile : ditContentRuleFiles )
{
try ( LdifReader reader = new LdifReader( ldifFile ) )
{
LdifEntry entry = reader.next();
ditContentRuleList.add( entry.getEntry() );
}
}
}
}
return ditContentRuleList;
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadDitStructureRules( Schema... schemas ) throws LdapException, IOException
{
List<Entry> ditStructureRuleList = new ArrayList<>();
if ( schemas == null )
{
return ditStructureRuleList;
}
for ( Schema schema : schemas )
{
File ditStructureRulesDirectory = new File( getSchemaDirectory( schema ),
SchemaConstants.DIT_STRUCTURE_RULES_PATH );
if ( !ditStructureRulesDirectory.exists() )
{
return ditStructureRuleList;
}
File[] ditStructureRuleFiles = ditStructureRulesDirectory.listFiles( ldifFilter );
if ( ditStructureRuleFiles != null )
{
for ( File ldifFile : ditStructureRuleFiles )
{
try ( LdifReader reader = new LdifReader( ldifFile ) )
{
LdifEntry entry = reader.next();
ditStructureRuleList.add( entry.getEntry() );
}
}
}
}
return ditStructureRuleList;
}
/**
* {@inheritDoc}
*/
@Override
public List<Entry> loadObjectClasses( Schema... schemas ) throws LdapException, IOException
{
List<Entry> objectClassList = new ArrayList<>();
if ( schemas == null )
{
return objectClassList;
}
for ( Schema schema : schemas )
{
// get objectClasses directory, check if exists, return if not
File objectClassesDirectory = new File( getSchemaDirectory( schema ), SchemaConstants.OBJECT_CLASSES_PATH );
if ( !objectClassesDirectory.exists() )
{
return objectClassList;
}
// get list of objectClass LDIF files from directory and load
File[] objectClassFiles = objectClassesDirectory.listFiles( ldifFilter );
if ( objectClassFiles != null )
{
for ( File ldifFile : objectClassFiles )
{
try ( LdifReader reader = new LdifReader( ldifFile ) )
{
LdifEntry entry = reader.next();
objectClassList.add( entry.getEntry() );
}
}
}
}
return objectClassList;
}
}