/* * 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 * * http://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.studio.openldap.config; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; 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.LdifReader; import org.apache.directory.api.ldap.model.schema.registries.Schema; import org.apache.directory.api.ldap.model.schema.registries.DefaultSchema; import org.apache.directory.api.ldap.schema.loader.JarLdifSchemaLoader; /** * This class implements a {@link SchemaLoader} based on the OpenLDAP schema bundled * with the class, as well as a set of low level base schemas from ApacheDS. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class OpenLdapSchemaLoader extends JarLdifSchemaLoader { /** The name of the OpenLDAP Config schema */ public static final String OPENLDAPCONFIG_SCHEMA_NAME = "openldapconfig"; /** The name of the LDIF file for the OpenLDAP Config schema */ private static final String OPENLDAPCONFIG_SHEMA_LDIF = "openldapconfig.ldif"; /** The attribute type pattern */ private static final Pattern ATTRIBUTE_TYPE_PATTERN = Pattern.compile( "m-oid\\s*=\\s*[0-9\\.]*\\s*" + ",\\s*ou\\s*=\\s*attributetypes\\s*,\\s*cn\\s*=\\s*" + OPENLDAPCONFIG_SCHEMA_NAME + "\\s*,\\s*ou=schema\\s*", Pattern.CASE_INSENSITIVE ); /** The object class pattern */ private static final Pattern OBJECT_CLASS_PATTERN = Pattern.compile( "m-oid\\s*=\\s*[0-9\\.]*\\s*" + ",\\s*ou\\s*=\\s*objectclasses\\s*,\\s*cn\\s*=\\s*" + OPENLDAPCONFIG_SCHEMA_NAME + "\\s*,\\s*ou=schema\\s*", Pattern.CASE_INSENSITIVE ); /** The attribute types entries */ private List<Entry> attributeTypesEntries = new ArrayList<Entry>(); /** The object classes entries */ private List<Entry> objectClassesEntries = new ArrayList<Entry>(); /** * Creates a new instance of ConnectionSchemaLoader. * * @throws Exception */ public OpenLdapSchemaLoader() throws Exception { super(); initializeSchema(); initializeSchemaObjects(); } /** * Initializes the schema. We will load 'system', 'core' and 'apache'. */ private void initializeSchema() { Schema schema = new DefaultSchema( null, OPENLDAPCONFIG_SCHEMA_NAME ); schema.addDependencies( new String[] { "system", "core", "apache" } ); schemaMap.put( schema.getSchemaName(), schema ); } /** * Initializes the schema objects. * * @throws Exception */ private void initializeSchemaObjects() throws Exception { LdifReader ldifReader = null; try { // Reading the schema file ldifReader = new LdifReader( OpenLdapSchemaLoader.class.getResourceAsStream( OPENLDAPCONFIG_SHEMA_LDIF ) ); // Looping on all entries while ( ldifReader.hasNext() ) { // Getting the LDIF entry and DN Entry entry = ldifReader.next().getEntry(); String dn = entry.getDn().getName(); // Checking if the entry is an attribute type if ( ATTRIBUTE_TYPE_PATTERN.matcher( dn ).matches() ) { attributeTypesEntries.add( entry ); } // Checking if the entry is an object class else if ( OBJECT_CLASS_PATTERN.matcher( dn ).matches() ) { objectClassesEntries.add( entry ); } } } finally { // Closing the LDIF reader if ( ldifReader != null ) { ldifReader.close(); } } } /** * {@inheritDoc} */ public List<Entry> loadAttributeTypes( Schema... schemas ) throws LdapException, IOException { // Getting the attribute types from the supertype implementation List<Entry> attributeTypes = super.loadAttributeTypes( schemas ); for ( Schema schema : schemas ) { // Checking if this is the OpenLDAP schema if ( OPENLDAPCONFIG_SCHEMA_NAME.equals( schema.getSchemaName() ) ) { // Add all attribute types attributeTypes.addAll( attributeTypesEntries ); } } return attributeTypes; } /** * {@inheritDoc} */ public List<Entry> loadObjectClasses( Schema... schemas ) throws LdapException, IOException { // Getting the object classes from the supertype implementation List<Entry> objectClasses = super.loadObjectClasses( schemas ); for ( Schema schema : schemas ) { // Checking if this is the OpenLDAP schema if ( OPENLDAPCONFIG_SCHEMA_NAME.equals( schema.getSchemaName() ) ) { // Add all object classes objectClasses.addAll( objectClassesEntries ); } } return objectClasses; } }