blob: 6291cb3008d8a072bef3eb73fcb2402100dc1e8a [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
*
* 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.server.config.builder;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import org.apache.directory.api.ldap.model.exception.LdapException;
import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
import org.apache.directory.api.ldap.model.ldif.LdapLdifException;
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.message.AliasDerefMode;
import org.apache.directory.api.ldap.model.message.SearchScope;
import org.apache.directory.api.ldap.model.schema.AttributeType;
import org.apache.directory.api.ldap.model.schema.SchemaManager;
import org.apache.directory.api.util.Strings;
import org.apache.directory.server.config.ConfigSchemaConstants;
import org.apache.directory.server.config.ConfigurationException;
import org.apache.directory.server.config.beans.AuthenticationInterceptorBean;
import org.apache.directory.server.config.beans.AuthenticatorBean;
import org.apache.directory.server.config.beans.AuthenticatorImplBean;
import org.apache.directory.server.config.beans.ChangeLogBean;
import org.apache.directory.server.config.beans.ChangePasswordServerBean;
import org.apache.directory.server.config.beans.DelegatingAuthenticatorBean;
import org.apache.directory.server.config.beans.DirectoryServiceBean;
import org.apache.directory.server.config.beans.ExtendedOpHandlerBean;
import org.apache.directory.server.config.beans.HttpServerBean;
import org.apache.directory.server.config.beans.HttpWebAppBean;
import org.apache.directory.server.config.beans.IndexBean;
import org.apache.directory.server.config.beans.InterceptorBean;
import org.apache.directory.server.config.beans.JdbmIndexBean;
import org.apache.directory.server.config.beans.JdbmPartitionBean;
import org.apache.directory.server.config.beans.JournalBean;
import org.apache.directory.server.config.beans.KdcServerBean;
import org.apache.directory.server.config.beans.LdapServerBean;
import org.apache.directory.server.config.beans.MavibotIndexBean;
import org.apache.directory.server.config.beans.MavibotPartitionBean;
import org.apache.directory.server.config.beans.NtpServerBean;
import org.apache.directory.server.config.beans.PartitionBean;
import org.apache.directory.server.config.beans.PasswordPolicyBean;
import org.apache.directory.server.config.beans.ReplConsumerBean;
import org.apache.directory.server.config.beans.SaslMechHandlerBean;
import org.apache.directory.server.config.beans.TcpTransportBean;
import org.apache.directory.server.config.beans.TransportBean;
import org.apache.directory.server.constants.ApacheSchemaConstants;
import org.apache.directory.server.core.DefaultDirectoryService;
import org.apache.directory.server.core.api.DirectoryService;
import org.apache.directory.server.core.api.InstanceLayout;
import org.apache.directory.server.core.api.authn.ppolicy.CheckQualityEnum;
import org.apache.directory.server.core.api.authn.ppolicy.DefaultPasswordValidator;
import org.apache.directory.server.core.api.authn.ppolicy.PasswordPolicyConfiguration;
import org.apache.directory.server.core.api.authn.ppolicy.PasswordValidator;
import org.apache.directory.server.core.api.changelog.ChangeLog;
import org.apache.directory.server.core.api.interceptor.Interceptor;
import org.apache.directory.server.core.api.journal.Journal;
import org.apache.directory.server.core.api.journal.JournalStore;
import org.apache.directory.server.core.api.partition.AbstractPartition;
import org.apache.directory.server.core.api.partition.Partition;
import org.apache.directory.server.core.authn.AuthenticationInterceptor;
import org.apache.directory.server.core.authn.Authenticator;
import org.apache.directory.server.core.authn.DelegatingAuthenticator;
import org.apache.directory.server.core.authn.ppolicy.PpolicyConfigContainer;
import org.apache.directory.server.core.changelog.DefaultChangeLog;
import org.apache.directory.server.core.journal.DefaultJournal;
import org.apache.directory.server.core.journal.DefaultJournalStore;
import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmDnIndex;
import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmIndex;
import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmPartition;
import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmRdnIndex;
import org.apache.directory.server.core.partition.impl.btree.mavibot.MavibotDnIndex;
import org.apache.directory.server.core.partition.impl.btree.mavibot.MavibotIndex;
import org.apache.directory.server.core.partition.impl.btree.mavibot.MavibotPartition;
import org.apache.directory.server.core.partition.impl.btree.mavibot.MavibotRdnIndex;
import org.apache.directory.server.integration.http.HttpServer;
import org.apache.directory.server.integration.http.WebApp;
import org.apache.directory.server.kerberos.ChangePasswordConfig;
import org.apache.directory.server.kerberos.KerberosConfig;
import org.apache.directory.server.kerberos.changepwd.ChangePasswordServer;
import org.apache.directory.server.kerberos.kdc.KdcServer;
import org.apache.directory.server.ldap.ExtendedOperationHandler;
import org.apache.directory.server.ldap.LdapServer;
import org.apache.directory.server.ldap.handlers.sasl.MechanismHandler;
import org.apache.directory.server.ldap.handlers.sasl.ntlm.NtlmMechanismHandler;
import org.apache.directory.server.ldap.replication.SyncReplConfiguration;
import org.apache.directory.server.ldap.replication.consumer.ReplicationConsumer;
import org.apache.directory.server.ldap.replication.consumer.ReplicationConsumerImpl;
import org.apache.directory.server.ldap.replication.provider.ReplicationRequestHandler;
import org.apache.directory.server.ldap.replication.provider.SyncReplRequestHandler;
import org.apache.directory.server.ntp.NtpServer;
import org.apache.directory.server.protocol.shared.transport.TcpTransport;
import org.apache.directory.server.protocol.shared.transport.Transport;
import org.apache.directory.server.protocol.shared.transport.UdpTransport;
import org.apache.directory.server.xdbm.Index;
import org.apache.directory.shared.kerberos.codec.types.EncryptionType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A class used for reading the configuration present in a Partition
* and instantiate the necessary objects like DirectoryService, Interceptors etc.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class ServiceBuilder
{
/** The logger for this class */
private static final Logger LOG = LoggerFactory.getLogger( ServiceBuilder.class );
/** LDIF file filter */
private static FilenameFilter ldifFilter = new FilenameFilter()
{
public boolean accept( File file, String name )
{
if ( file.isDirectory() )
{
return true;
}
return Strings.toLowerCase( file.getName() ).endsWith( ".ldif" );
}
};
/**
* Creates the Interceptor instances from the configuration
*
* @param dirServiceDN the Dn under which interceptors are configured
* @return a list of instantiated Interceptor objects
* @throws Exception If the instanciation failed
*/
public static List<Interceptor> createInterceptors( List<InterceptorBean> interceptorBeans ) throws LdapException
{
List<Interceptor> interceptors = new ArrayList<Interceptor>( interceptorBeans.size() );
// First order the interceptorBeans
Set<InterceptorBean> orderedInterceptorBeans = new TreeSet<InterceptorBean>();
for ( InterceptorBean interceptorBean : interceptorBeans )
{
if ( interceptorBean.isEnabled() )
{
orderedInterceptorBeans.add( interceptorBean );
}
}
// Instantiate the interceptors now
for ( InterceptorBean interceptorBean : orderedInterceptorBeans )
{
try
{
LOG.debug( "loading the interceptor class {} and instantiating",
interceptorBean.getInterceptorClassName() );
Interceptor interceptor = ( Interceptor ) Class.forName( interceptorBean.getInterceptorClassName() )
.newInstance();
if ( interceptorBean instanceof AuthenticationInterceptorBean )
{
// Transports
Authenticator[] authenticators = createAuthenticators( ( ( AuthenticationInterceptorBean ) interceptorBean )
.getAuthenticators() );
( ( AuthenticationInterceptor ) interceptor ).setAuthenticators( authenticators );
// password policies
List<PasswordPolicyBean> ppolicyBeans = ( ( AuthenticationInterceptorBean ) interceptorBean )
.getPasswordPolicies();
PpolicyConfigContainer ppolicyContainer = new PpolicyConfigContainer();
for ( PasswordPolicyBean ppolicyBean : ppolicyBeans )
{
PasswordPolicyConfiguration ppolicyConfig = createPwdPolicyConfig( ppolicyBean );
if ( ppolicyConfig != null )
{
// the name should be strictly 'default', the default policy can't be enforced by defining a new AT
if ( ppolicyBean.getPwdId().equalsIgnoreCase( "default" ) )
{
ppolicyContainer.setDefaultPolicy( ppolicyConfig );
}
else
{
ppolicyContainer.addPolicy( ppolicyBean.getDn(), ppolicyConfig );
}
}
}
( ( AuthenticationInterceptor ) interceptor ).setPwdPolicies( ppolicyContainer );
}
interceptors.add( interceptor );
}
catch ( Exception e )
{
e.printStackTrace();
String message = "Cannot initialize the " + interceptorBean.getInterceptorClassName() + ", error : "
+ e;
LOG.error( message );
throw new ConfigurationException( message );
}
}
return interceptors;
}
/**
* creates the PassworddPolicyConfiguration object after reading the config entry containing pwdpolicy OC
*
* @param PasswordPolicyBean The Bean containing the PasswordPolicy configuration
* @return the {@link PasswordPolicyConfiguration} object, null if the pwdpolicy entry is not present or disabled
*/
public static PasswordPolicyConfiguration createPwdPolicyConfig( PasswordPolicyBean passwordPolicyBean )
{
if ( ( passwordPolicyBean == null ) || passwordPolicyBean.isDisabled() )
{
return null;
}
PasswordPolicyConfiguration passwordPolicy = new PasswordPolicyConfiguration();
passwordPolicy.setPwdAllowUserChange( passwordPolicyBean.isPwdAllowUserChange() );
passwordPolicy.setPwdAttribute( passwordPolicyBean.getPwdAttribute() );
passwordPolicy.setPwdCheckQuality( CheckQualityEnum.getCheckQuality( passwordPolicyBean.getPwdCheckQuality() ) );
passwordPolicy.setPwdExpireWarning( passwordPolicyBean.getPwdExpireWarning() );
passwordPolicy.setPwdFailureCountInterval( passwordPolicyBean.getPwdFailureCountInterval() );
passwordPolicy.setPwdGraceAuthNLimit( passwordPolicyBean.getPwdGraceAuthNLimit() );
passwordPolicy.setPwdGraceExpire( passwordPolicyBean.getPwdGraceExpire() );
passwordPolicy.setPwdInHistory( passwordPolicyBean.getPwdInHistory() );
passwordPolicy.setPwdLockout( passwordPolicyBean.isPwdLockout() );
passwordPolicy.setPwdLockoutDuration( passwordPolicyBean.getPwdLockoutDuration() );
passwordPolicy.setPwdMaxAge( passwordPolicyBean.getPwdMaxAge() );
passwordPolicy.setPwdMaxDelay( passwordPolicyBean.getPwdMaxDelay() );
passwordPolicy.setPwdMaxFailure( passwordPolicyBean.getPwdMaxFailure() );
passwordPolicy.setPwdMaxIdle( passwordPolicyBean.getPwdMaxIdle() );
passwordPolicy.setPwdMaxLength( passwordPolicyBean.getPwdMaxLength() );
passwordPolicy.setPwdMinAge( passwordPolicyBean.getPwdMinAge() );
passwordPolicy.setPwdMinDelay( passwordPolicyBean.getPwdMinDelay() );
passwordPolicy.setPwdMinLength( passwordPolicyBean.getPwdMinLength() );
passwordPolicy.setPwdMustChange( passwordPolicyBean.isPwdMustChange() );
passwordPolicy.setPwdSafeModify( passwordPolicyBean.isPwdSafeModify() );
PasswordValidator validator = null;
try
{
String className = passwordPolicyBean.getPwdValidator();
if ( className != null )
{
Class<?> cls = Class.forName( className );
validator = ( PasswordValidator ) cls.newInstance();
}
}
catch ( Exception e )
{
LOG.warn(
"Failed to load and instantiate the custom password validator for password policy config {}, using the default validator",
passwordPolicyBean.getDn(), e );
}
if ( validator == null )
{
validator = new DefaultPasswordValidator();
}
passwordPolicy.setPwdValidator( validator );
return passwordPolicy;
}
/**
* Read the configuration for the ChangeLog system
*
* @param changelogBean The Bean containing the ChangeLog configuration
* @return The instantiated ChangeLog element
*/
public static ChangeLog createChangeLog( ChangeLogBean changeLogBean )
{
if ( ( changeLogBean == null ) || changeLogBean.isDisabled() )
{
return null;
}
ChangeLog changeLog = new DefaultChangeLog();
changeLog.setEnabled( changeLogBean.isEnabled() );
changeLog.setExposed( changeLogBean.isChangeLogExposed() );
return changeLog;
}
/**
* Instantiate the Journal object from the stored configuration
*
* @param changelogBean The Bean containing the ChangeLog configuration
* @return An instance of Journal
*/
public static Journal createJournal( JournalBean journalBean )
{
if ( ( journalBean == null ) || journalBean.isDisabled() )
{
return null;
}
Journal journal = new DefaultJournal();
journal.setRotation( journalBean.getJournalRotation() );
journal.setEnabled( journalBean.isEnabled() );
JournalStore store = new DefaultJournalStore();
store.setFileName( journalBean.getJournalFileName() );
store.setWorkingDirectory( journalBean.getJournalWorkingDir() );
journal.setJournalStore( store );
return journal;
}
/**
* Load the Test entries
*
* @param entryFilePath The place on disk where the test entries are stored
* @return A list of LdifEntry elements
* @throws ConfigurationException If we weren't able to read the entries
*/
public static List<LdifEntry> readTestEntries( String entryFilePath ) throws ConfigurationException
{
List<LdifEntry> entries = new ArrayList<LdifEntry>();
File file = new File( entryFilePath );
if ( !file.exists() )
{
LOG.warn( "LDIF test entry file path doesn't exist {}", entryFilePath );
}
else
{
LOG.debug( "parsing the LDIF file(s) present at the path {}", entryFilePath );
try
{
loadEntries( file, entries );
}
catch ( LdapLdifException e )
{
String message = "Error while parsing a LdifEntry : " + e.getMessage();
LOG.error( message );
throw new ConfigurationException( message );
}
catch ( IOException e )
{
String message = "cannot read the Ldif entries from the " + entryFilePath + " location";
LOG.error( message );
throw new ConfigurationException( message );
}
}
return entries;
}
/**
* Load the entries from a Ldif file recursively
* @throws LdapLdifException
* @throws IOException
*/
private static void loadEntries( File ldifFile, List<LdifEntry> entries ) throws LdapLdifException, IOException
{
if ( ldifFile.isDirectory() )
{
File[] files = ldifFile.listFiles( ldifFilter );
for ( File f : files )
{
loadEntries( f, entries );
}
}
else
{
LdifReader reader = new LdifReader();
try
{
entries.addAll( reader.parseLdifFile( ldifFile.getAbsolutePath() ) );
}
finally
{
reader.close();
}
}
}
/**
* Loads and instantiates a MechanismHandler from the configuration entry
*
* @param saslMechHandlerEntry the entry of OC type {@link ConfigSchemaConstants#ADS_LDAP_SERVER_SASL_MECH_HANDLER_OC}
* @return an instance of the MechanismHandler type
* @throws ConfigurationException if the SASL mechanism handler cannot be created
*/
public static MechanismHandler createSaslMechHandler( SaslMechHandlerBean saslMechHandlerBean )
throws ConfigurationException
{
if ( ( saslMechHandlerBean == null ) || saslMechHandlerBean.isDisabled() )
{
return null;
}
String mechClassName = saslMechHandlerBean.getSaslMechClassName();
Class<?> mechClass = null;
try
{
mechClass = Class.forName( mechClassName );
}
catch ( ClassNotFoundException e )
{
String message = "Cannot find the class " + mechClassName;
LOG.error( message );
throw new ConfigurationException( message );
}
MechanismHandler handler = null;
try
{
handler = ( MechanismHandler ) mechClass.newInstance();
}
catch ( InstantiationException e )
{
String message = "Cannot instantiate the class : " + mechClassName;
LOG.error( message );
throw new ConfigurationException( message );
}
catch ( IllegalAccessException e )
{
String message = "Cnnot invoke the class' constructor for " + mechClassName;
LOG.error( message );
throw new ConfigurationException( message );
}
if ( mechClass == NtlmMechanismHandler.class )
{
NtlmMechanismHandler ntlmHandler = ( NtlmMechanismHandler ) handler;
ntlmHandler.setNtlmProviderFqcn( saslMechHandlerBean.getNtlmMechProvider() );
}
return handler;
}
/**
* Creates a Authenticator from the configuration
*
* @param authenticatorBean The created instance of authenticator
* @return An instance of authenticator if the given authenticatorBean is not disabled
*/
public static Authenticator createAuthenticator( AuthenticatorBean authenticatorBean )
throws ConfigurationException
{
if ( authenticatorBean.isDisabled() )
{
return null;
}
Authenticator authenticator = null;
if ( authenticatorBean instanceof DelegatingAuthenticatorBean )
{
authenticator = new DelegatingAuthenticator();
( ( DelegatingAuthenticator ) authenticator )
.setDelegateHost( ( ( DelegatingAuthenticatorBean ) authenticatorBean ).getDelegateHost() );
( ( DelegatingAuthenticator ) authenticator )
.setDelegatePort( ( ( DelegatingAuthenticatorBean ) authenticatorBean ).getDelegatePort() );
}
else if ( authenticatorBean instanceof AuthenticatorImplBean )
{
String fqcn = ( ( AuthenticatorImplBean ) authenticatorBean ).getAuthenticatorClass();
try
{
Class<?> authnImplClass = Class.forName( fqcn );
authenticator = ( Authenticator ) authnImplClass.newInstance();
}
catch ( Exception e )
{
String errorMsg = "Failed to instantiate the configured authenticator "
+ authenticatorBean.getAuthenticatorId();
LOG.warn( errorMsg );
throw new ConfigurationException( errorMsg, e );
}
}
return authenticator;
}
/**
* Creates a Transport from the configuration
*
* @param transportBean The created instance of transport
* @return An instance of transport
*/
public static Transport createTransport( TransportBean transportBean )
{
if ( ( transportBean == null ) || transportBean.isDisabled() )
{
return null;
}
Transport transport = null;
if ( transportBean instanceof TcpTransportBean )
{
transport = new TcpTransport();
}
else
{
transport = new UdpTransport();
}
transport.setPort( transportBean.getSystemPort() );
transport.setAddress( transportBean.getTransportAddress() );
transport.setBackLog( transportBean.getTransportBackLog() );
transport.setEnableSSL( transportBean.isTransportEnableSSL() );
transport.setNbThreads( transportBean.getTransportNbThreads() );
return transport;
}
/**
* Creates the array of transports read from the DIT
*
* @param transportBeans The array of Transport configuration
* @return An arry of Transport instance
*/
public static Authenticator[] createAuthenticators( List<AuthenticatorBean> list ) throws ConfigurationException
{
Set<Authenticator> authenticators = new HashSet<Authenticator>( list.size() );
for ( AuthenticatorBean authenticatorBean : list )
{
if ( authenticatorBean.isEnabled() )
{
authenticators.add( createAuthenticator( authenticatorBean ) );
}
}
return authenticators.toArray( new Authenticator[]
{} );
}
/**
* Creates the array of transports read from the DIT
*
* @param transportBeans The array of Transport configuration
* @return An arry of Transport instance
*/
public static Transport[] createTransports( TransportBean[] transportBeans )
{
List<Transport> transports = new ArrayList<Transport>();
for ( TransportBean transportBean : transportBeans )
{
if ( transportBean.isEnabled() )
{
transports.add( createTransport( transportBean ) );
}
}
return transports.toArray( new Transport[transports.size()] );
}
/**
* Helper method to create an Array of EncryptionTypes from an array of Strings
*/
private static EncryptionType[] createEncryptionTypes( List<String> encryptionTypes )
{
if ( ( encryptionTypes == null ) || ( encryptionTypes.size() == 0 ) )
{
return new EncryptionType[0];
}
List<EncryptionType> types = new ArrayList<EncryptionType>();
for ( String encryptionType : encryptionTypes )
{
EncryptionType et = EncryptionType.getByName( encryptionType );
if ( et == EncryptionType.UNKNOWN )
{
LOG.warn( "Unknown encryption type {}", encryptionType );
}
else
{
types.add( et );
}
}
return types.toArray( new EncryptionType[0] );
}
/**
* Instantiates a NtpServer based on the configuration present in the partition
*
* @param ntpServerBean The NtpServerBean containing the NtpServer configuration
* @return Instance of NtpServer
* @throws org.apache.directory.api.ldap.model.exception.LdapException
*/
public static NtpServer createNtpServer( NtpServerBean ntpServerBean, DirectoryService directoryService )
throws LdapException
{
// Fist, do nothing if the NtpServer is disabled
if ( ( ntpServerBean == null ) || ntpServerBean.isDisabled() )
{
return null;
}
NtpServer ntpServer = new NtpServer();
// The service ID
ntpServer.setServiceId( ntpServerBean.getServerId() );
// The transports
Transport[] transports = createTransports( ntpServerBean.getTransports() );
ntpServer.setTransports( transports );
return ntpServer;
}
/**
* Instantiates a DhcpServer based on the configuration present in the partition
*
* @param dhcpServerBean The DhcpServerBean containing the DhcpServer configuration
* @return Instance of DhcpServer
* @throws LdapException
*
public static DhcpServer createDhcpServer( DhcpServerBean dhcpServerBean, DirectoryService directoryService ) throws LdapException
{
// Fist, do nothing if the DhcpServer is disabled
if ( !dhcpServerBean.isEnabled() )
{
return null;
}
DhcpServer dhcpServer = new DhcpServer();
// The service ID
dhcpServer.setServiceId( dhcpServerBean.getServerId() );
// The transports
Transport[] transports = createTransports( dhcpServerBean.getTransports() );
dhcpServer.setTransports( transports );
return dhcpServer;
}
/**
* Instantiates a KdcServer based on the configuration present in the partition
*
* @param kdcServerBean The KdcServerBean containing the KdcServer configuration
* @return Instance of KdcServer
* @throws org.apache.directory.api.ldap.model.exception.LdapException
*/
public static KdcServer createKdcServer( DirectoryServiceBean directoryServiceBean,
DirectoryService directoryService ) throws LdapException
{
KdcServerBean kdcServerBean = directoryServiceBean.getKdcServerBean();
// Fist, do nothing if the KdcServer is disabled
if ( ( kdcServerBean == null ) || kdcServerBean.isDisabled() )
{
return null;
}
KerberosConfig kdcConfig = new KerberosConfig();
// AllowableClockSkew
kdcConfig.setAllowableClockSkew( kdcServerBean.getKrbAllowableClockSkew() );
// BodyChecksumVerified
kdcConfig.setBodyChecksumVerified( kdcServerBean.isKrbBodyChecksumVerified() );
// EmptyAddressesAllowed
kdcConfig.setEmptyAddressesAllowed( kdcServerBean.isKrbEmptyAddressesAllowed() );
// EncryptionType
EncryptionType[] encryptionTypes = createEncryptionTypes( kdcServerBean.getKrbEncryptionTypes() );
kdcConfig.setEncryptionTypes( encryptionTypes );
// ForwardableAllowed
kdcConfig.setForwardableAllowed( kdcServerBean.isKrbForwardableAllowed() );
// KdcPrincipal
kdcConfig.setServicePrincipal( "krbtgt/" + kdcServerBean.getKrbPrimaryRealm() + "@"
+ kdcServerBean.getKrbPrimaryRealm() );
// MaximumRenewableLifetime
kdcConfig.setMaximumRenewableLifetime( kdcServerBean.getKrbMaximumRenewableLifetime() );
// MaximumTicketLifetime
kdcConfig.setMaximumTicketLifetime( kdcServerBean.getKrbMaximumTicketLifetime() );
// PaEncTimestampRequired
kdcConfig.setPaEncTimestampRequired( kdcServerBean.isKrbPaEncTimestampRequired() );
// PostdatedAllowed
kdcConfig.setPostdatedAllowed( kdcServerBean.isKrbPostdatedAllowed() );
// PrimaryRealm
kdcConfig.setPrimaryRealm( kdcServerBean.getKrbPrimaryRealm() );
// ProxiableAllowed
kdcConfig.setProxiableAllowed( kdcServerBean.isKrbProxiableAllowed() );
// RenewableAllowed
kdcConfig.setRenewableAllowed( kdcServerBean.isKrbRenewableAllowed() );
// searchBaseDn
kdcConfig.setSearchBaseDn( kdcServerBean.getSearchBaseDn().getName() );
KdcServer kdcServer = new KdcServer( kdcConfig );
kdcServer.setDirectoryService( directoryService );
kdcServer.setEnabled( true );
// The ID
kdcServer.setServiceId( kdcServerBean.getServerId() );
// The transports
Transport[] transports = createTransports( kdcServerBean.getTransports() );
kdcServer.setTransports( transports );
ChangePasswordServerBean changePasswordServerBean = directoryServiceBean.getChangePasswordServerBean();
// Fist, do nothing if the ChangePasswordServer is disabled
if ( ( changePasswordServerBean != null ) && !changePasswordServerBean.isDisabled() )
{
ChangePasswordServer changePasswordServer = new ChangePasswordServer( new ChangePasswordConfig( kdcConfig ) );
changePasswordServer.setEnabled( true );
changePasswordServer.setDirectoryService( directoryService );
// Transports
Transport[] chngPwdTransports = createTransports( changePasswordServerBean.getTransports() );
changePasswordServer.setTransports( chngPwdTransports );
kdcServer.setChangePwdServer( changePasswordServer );
}
return kdcServer;
}
/**
* Instantiates the HttpWebApps based on the configuration present in the partition
*
* @param httpWebAppBeans The list of HttpWebAppBeans containing the HttpWebAppBeans configuration
* @return Instances of HttpWebAppBean
* @throws LdapException
*/
public static Set<WebApp> createHttpWebApps( List<HttpWebAppBean> httpWebAppBeans, DirectoryService directoryService )
throws LdapException
{
Set<WebApp> webApps = new HashSet<WebApp>();
if ( httpWebAppBeans == null )
{
return webApps;
}
for ( HttpWebAppBean httpWebAppBean : httpWebAppBeans )
{
if ( httpWebAppBean.isDisabled() )
{
continue;
}
WebApp webApp = new WebApp();
// HttpAppCtxPath
webApp.setContextPath( httpWebAppBean.getHttpAppCtxPath() );
// HttpWarFile
webApp.setWarFile( httpWebAppBean.getHttpWarFile() );
webApps.add( webApp );
}
return webApps;
}
/**
* Instantiates a HttpServer based on the configuration present in the partition
*
* @param httpServerBean The HttpServerBean containing the HttpServer configuration
* @return Instance of LdapServer
* @throws LdapException
*/
public static HttpServer createHttpServer( HttpServerBean httpServerBean, DirectoryService directoryService )
throws LdapException
{
// Fist, do nothing if the HttpServer is disabled
if ( ( httpServerBean == null ) || httpServerBean.isDisabled() )
{
return null;
}
HttpServer httpServer = new HttpServer();
// HttpConfFile
httpServer.setConfFile( httpServerBean.getHttpConfFile() );
// The transports
TransportBean[] transports = httpServerBean.getTransports();
for ( TransportBean transportBean : transports )
{
if ( transportBean.isDisabled() )
{
continue;
}
if ( transportBean instanceof TcpTransportBean )
{
TcpTransport transport = new TcpTransport( transportBean.getSystemPort() );
transport.setAddress( transportBean.getTransportAddress() );
if ( transportBean.getTransportId().equalsIgnoreCase( HttpServer.HTTP_TRANSPORT_ID ) )
{
httpServer.setHttpTransport( transport );
}
else if ( transportBean.getTransportId().equalsIgnoreCase( HttpServer.HTTPS_TRANSPORT_ID ) )
{
httpServer.setHttpsTransport( transport );
}
else
{
LOG.warn( "Transport ids of HttpServer should be either 'http' or 'https'" );
}
}
}
// The webApps
httpServer.setWebApps( createHttpWebApps( httpServerBean.getHttpWebApps(), directoryService ) );
return httpServer;
}
/**
* Instantiates a ChangePasswordServer based on the configuration present in the partition
*
* @param ldapServerBean The ChangePasswordServerBean containing the ChangePasswordServer configuration
* @return Instance of ChangePasswordServer
* @throws LdapException
*
public static ChangePasswordServer createChangePasswordServer( ChangePasswordServerBean changePasswordServerBean, DirectoryService directoryService ) throws LdapException
{
// Fist, do nothing if the LdapServer is disabled
if ( ( changePasswordServerBean == null ) || changePasswordServerBean.isDisabled() )
{
return null;
}
ChangePasswordServer changePasswordServer = new ChangePasswordServer();
changePasswordServer.setEnabled( true );
changePasswordServer.setDirectoryService( directoryService );
// AllowableClockSkew
changePasswordServer.setAllowableClockSkew( changePasswordServerBean.getKrbAllowableClockSkew() );
// TODO CatalogBased
//changePasswordServer.setCatalogBased( changePasswordServerBean.isCatalogBase() );
// EmptyAddressesAllowed
changePasswordServer.setEmptyAddressesAllowed( changePasswordServerBean.isKrbEmptyAddressesAllowed() );
// EncryptionTypes
EncryptionType[] encryptionTypes = createEncryptionTypes( changePasswordServerBean.getKrbEncryptionTypes() );
changePasswordServer.setEncryptionTypes( encryptionTypes );
// PolicyCategoryCount
changePasswordServer.setPolicyCategoryCount( changePasswordServerBean.getChgPwdPolicyCategoryCount() );
// PolicyPasswordLength
changePasswordServer.setPolicyPasswordLength( changePasswordServerBean.getChgPwdPolicyPasswordLength() );
// policyTokenSize
changePasswordServer.setPolicyTokenSize( changePasswordServerBean.getChgPwdPolicyTokenSize() );
// PrimaryRealm
changePasswordServer.setPrimaryRealm( changePasswordServerBean.getKrbPrimaryRealm() );
// SearchBaseDn
changePasswordServer.setSearchBaseDn( changePasswordServerBean.getSearchBaseDn().getName() );
// Id/Name
changePasswordServer.setServiceName( changePasswordServerBean.getServerId() );
changePasswordServer.setServiceId( changePasswordServerBean.getServerId() );
// ServicePrincipal
changePasswordServer.setServicePrincipal( changePasswordServerBean.getChgPwdServicePrincipal() );
// Transports
Transport[] transports = createTransports( changePasswordServerBean.getTransports() );
changePasswordServer.setTransports( transports );
return changePasswordServer;
}
*/
/**
* Instantiates a LdapServer based on the configuration present in the partition
*
* @param ldapServerBean The LdapServerBean containing the LdapServer configuration
* @return Instance of LdapServer
* @throws LdapException
*/
public static LdapServer createLdapServer( LdapServerBean ldapServerBean, DirectoryService directoryService )
throws LdapException
{
// Fist, do nothing if the LdapServer is disabled
if ( ( ldapServerBean == null ) || ldapServerBean.isDisabled() )
{
return null;
}
LdapServer ldapServer = new LdapServer();
ldapServer.setDirectoryService( directoryService );
ldapServer.setEnabled( true );
// The ID
ldapServer.setServiceId( ldapServerBean.getServerId() );
// SearchBaseDN
ldapServer.setSearchBaseDn( ldapServerBean.getSearchBaseDn().getName() );
// KeyStore
ldapServer.setKeystoreFile( ldapServerBean.getLdapServerKeystoreFile() );
// Certificate password
ldapServer.setCertificatePassword( ldapServerBean.getLdapServerCertificatePassword() );
// ConfidentialityRequired
ldapServer.setConfidentialityRequired( ldapServerBean.isLdapServerConfidentialityRequired() );
// Max size limit
ldapServer.setMaxSizeLimit( ldapServerBean.getLdapServerMaxSizeLimit() );
// Max time limit
ldapServer.setMaxTimeLimit( ldapServerBean.getLdapServerMaxTimeLimit() );
// MaxPDUSize
ldapServer.setMaxPDUSize( ldapServerBean.getMaxPDUSize() );
// Sasl Host
ldapServer.setSaslHost( ldapServerBean.getLdapServerSaslHost() );
// Sasl Principal
ldapServer.setSaslPrincipal( ldapServerBean.getLdapServerSaslPrincipal() );
// Sasl realm
ldapServer.setSaslRealms( ldapServerBean.getLdapServerSaslRealms() );
// Relplication pinger thread sleep time
ldapServer.setReplPingerSleepTime( ldapServerBean.getReplPingerSleep() );
// Enabled cipher suites
if ( ldapServerBean.getEnabledCipherSuites() != null )
{
ldapServer.setEnabledCipherSuites( ldapServerBean.getEnabledCipherSuites() );
}
// The transports
Transport[] transports = createTransports( ldapServerBean.getTransports() );
ldapServer.setTransports( transports );
// SaslMechs
for ( SaslMechHandlerBean saslMechHandlerBean : ldapServerBean.getSaslMechHandlers() )
{
if ( saslMechHandlerBean.isEnabled() )
{
String mechanism = saslMechHandlerBean.getSaslMechName();
ldapServer.addSaslMechanismHandler( mechanism, createSaslMechHandler( saslMechHandlerBean ) );
}
}
// ExtendedOpHandlers
for ( ExtendedOpHandlerBean extendedpHandlerBean : ldapServerBean.getExtendedOps() )
{
if ( extendedpHandlerBean.isEnabled() )
{
try
{
Class<?> extendedOpClass = Class.forName( extendedpHandlerBean.getExtendedOpHandlerClass() );
ExtendedOperationHandler<?, ?> extOpHandler = ( ExtendedOperationHandler<?, ?> ) extendedOpClass.newInstance();
ldapServer.addExtendedOperationHandler( extOpHandler );
}
catch ( Exception e )
{
String message = "Failed to load and instantiate ExtendedOperationHandler implementation "
+ extendedpHandlerBean.getExtendedOpId() + ": " + e.getMessage();
LOG.error( message );
throw new ConfigurationException( message );
}
}
}
// ReplReqHandler
boolean replicationEnabled = ldapServerBean.isReplEnabled();
if ( replicationEnabled )
{
String fqcn = ldapServerBean.getReplReqHandler();
if ( fqcn != null )
{
try
{
Class<?> replProvImplClz = Class.forName( fqcn );
ReplicationRequestHandler rp = ( ReplicationRequestHandler ) replProvImplClz.newInstance();
ldapServer.setReplicationReqHandler( rp );
}
catch ( Exception e )
{
String message = "Failed to load and instantiate ReplicationRequestHandler implementation : "
+ fqcn;
LOG.error( message );
throw new ConfigurationException( message );
}
}
else
{
// Try with the default handler
ReplicationRequestHandler rp = new SyncReplRequestHandler();
ldapServer.setReplicationReqHandler( rp );
}
}
ldapServer.setReplConsumers( createReplConsumers( ldapServerBean.getReplConsumers() ) );
return ldapServer;
}
/**
* instantiate the ReplicationConsumers based on the configuration present in ReplConsumerBeans
*
* @param replConsumerBeans the list of consumers configured
* @return a list of ReplicationConsumer instances
* @throws ConfigurationException
*/
public static List<ReplicationConsumer> createReplConsumers( List<ReplConsumerBean> replConsumerBeans )
throws ConfigurationException
{
List<ReplicationConsumer> lst = new ArrayList<ReplicationConsumer>();
if ( replConsumerBeans == null )
{
return lst;
}
for ( ReplConsumerBean replBean : replConsumerBeans )
{
if ( replBean.isDisabled() )
{
continue;
}
String className = replBean.getReplConsumerImpl();
ReplicationConsumer consumer = null;
Class<?> consumerClass = null;
SyncReplConfiguration config = null;
try
{
if ( className == null )
{
consumer = new ReplicationConsumerImpl();
}
else
{
consumerClass = Class.forName( className );
consumer = ( ReplicationConsumer ) consumerClass.newInstance();
}
// we don't support any other configuration impls atm, but this configuration should suffice for many needs
config = new SyncReplConfiguration();
config.setBaseDn( replBean.getSearchBaseDn() );
config.setRemoteHost( replBean.getReplProvHostName() );
config.setRemotePort( replBean.getReplProvPort() );
try
{
config.setAliasDerefMode( AliasDerefMode.getDerefMode( replBean.getReplAliasDerefMode() ) );
}
catch ( IllegalArgumentException iae )
{
LOG.error( iae.getMessage() + ", defaulted to 'never'" );
}
config.setAttributes( replBean.getReplAttributes().toArray( new String[0] ) );
config.setRefreshInterval( replBean.getReplRefreshInterval() );
config.setRefreshNPersist( replBean.isReplRefreshNPersist() );
int scope = SearchScope.getSearchScope( replBean.getReplSearchScope() );
config.setSearchScope( SearchScope.getSearchScope( scope ) );
config.setFilter( replBean.getReplSearchFilter() );
config.setSearchTimeout( replBean.getReplSearchTimeout() );
config.setReplUserDn( replBean.getReplUserDn() );
config.setReplUserPassword( replBean.getReplUserPassword() );
config.setSearchSizeLimit( replBean.getReplSearchSizeLimit() );
config.setUseTls( replBean.isReplUseTls() );
config.setStrictCertVerification( replBean.isReplStrictCertValidation() );
config.setConfigEntryDn( replBean.getDn() );
consumer.setConfig( config );
lst.add( consumer );
}
catch ( Exception e )
{
throw new ConfigurationException( "cannot configure the replication consumer with FQCN " + className, e );
}
}
return lst;
}
/**
* Create a new instance of a JdbmIndex from an instance of JdbmIndexBean
*
* @param JdbmIndexBean The JdbmIndexBean to convert
* @return An JdbmIndex instance
* @throws Exception If the instance cannot be created
*/
public static JdbmIndex<?> createJdbmIndex( JdbmPartition partition,
JdbmIndexBean jdbmIndexBean, DirectoryService directoryService )
{
if ( ( jdbmIndexBean == null ) || jdbmIndexBean.isDisabled() )
{
return null;
}
String indexFileName = jdbmIndexBean.getIndexFileName();
if ( indexFileName == null )
{
indexFileName = jdbmIndexBean.getIndexAttributeId();
}
JdbmIndex<?> index = null;
boolean hasReverse = jdbmIndexBean.getIndexHasReverse();
if ( jdbmIndexBean.getIndexAttributeId().equalsIgnoreCase( ApacheSchemaConstants.APACHE_RDN_AT ) ||
jdbmIndexBean.getIndexAttributeId().equalsIgnoreCase( ApacheSchemaConstants.APACHE_RDN_AT_OID ) )
{
index = new JdbmRdnIndex();
}
else if ( jdbmIndexBean.getIndexAttributeId().equalsIgnoreCase( ApacheSchemaConstants.APACHE_ALIAS_AT ) ||
jdbmIndexBean.getIndexAttributeId().equalsIgnoreCase( ApacheSchemaConstants.APACHE_ALIAS_AT_OID ) )
{
index = new JdbmDnIndex( ApacheSchemaConstants.APACHE_ALIAS_AT_OID );
}
else
{
index = new JdbmIndex<String>( jdbmIndexBean.getIndexAttributeId(), hasReverse );
}
index.setCacheSize( jdbmIndexBean.getIndexCacheSize() );
index.setNumDupLimit( jdbmIndexBean.getIndexNumDupLimit() );
// Find the OID for this index
SchemaManager schemaManager = directoryService.getSchemaManager();
try
{
AttributeType indexAT = schemaManager.lookupAttributeTypeRegistry( indexFileName );
indexFileName = indexAT.getOid();
}
catch ( LdapException le )
{
// Not found ? We will use the index file name
}
if ( jdbmIndexBean.getIndexWorkingDir() != null )
{
index.setWkDirPath( new File( jdbmIndexBean.getIndexWorkingDir() ).toURI() );
}
else
{
// Set the Partition working dir as a default
index.setWkDirPath( partition.getPartitionPath() );
}
return index;
}
/**
* Create the list of Index from the configuration
*/
private static Set<Index<?, String>> createJdbmIndexes( JdbmPartition partition,
List<IndexBean> indexesBeans,
DirectoryService directoryService ) //throws Exception
{
Set<Index<?, String>> indexes = new HashSet<Index<?, String>>();
for ( IndexBean indexBean : indexesBeans )
{
if ( indexBean.isEnabled() && ( indexBean instanceof JdbmIndexBean ) )
{
indexes.add( createJdbmIndex( partition, ( JdbmIndexBean ) indexBean, directoryService ) );
}
}
return indexes;
}
/**
* Create a new instance of a JdbmPartition
*
* @param jdbmPartitionBean the JdbmPartition bean
* @return The instantiated JdbmPartition
* @throws LdapInvalidDnException
* @throws Exception If the instance cannot be created
*/
public static JdbmPartition createJdbmPartition( DirectoryService directoryService,
JdbmPartitionBean jdbmPartitionBean ) throws ConfigurationException
{
if ( ( jdbmPartitionBean == null ) || jdbmPartitionBean.isDisabled() )
{
return null;
}
JdbmPartition jdbmPartition = new JdbmPartition( directoryService.getSchemaManager(),
directoryService.getDnFactory() );
jdbmPartition.setCacheSize( jdbmPartitionBean.getPartitionCacheSize() );
jdbmPartition.setId( jdbmPartitionBean.getPartitionId() );
jdbmPartition.setOptimizerEnabled( jdbmPartitionBean.isJdbmPartitionOptimizerEnabled() );
File partitionPath = new File( directoryService.getInstanceLayout().getPartitionsDirectory(),
jdbmPartitionBean.getPartitionId() );
jdbmPartition.setPartitionPath( partitionPath.toURI() );
try
{
jdbmPartition.setSuffixDn( jdbmPartitionBean.getPartitionSuffix() );
}
catch ( LdapInvalidDnException lide )
{
String message = "Cannot set the Dn " + jdbmPartitionBean.getPartitionSuffix() + ", " + lide.getMessage();
LOG.error( message );
throw new ConfigurationException( message );
}
jdbmPartition.setSyncOnWrite( jdbmPartitionBean.isPartitionSyncOnWrite() );
jdbmPartition.setIndexedAttributes( createJdbmIndexes( jdbmPartition, jdbmPartitionBean.getIndexes(),
directoryService ) );
setContextEntry( jdbmPartitionBean, jdbmPartition );
return jdbmPartition;
}
/**
* Create the a Partition instantiated from the configuration
*
* @param partitionBean the Partition bean
* @return The instantiated Partition
* @throws ConfigurationException If we cannot process the Partition
*/
public static Partition createPartition( DirectoryService directoryService, PartitionBean partitionBean )
throws ConfigurationException
{
if ( ( partitionBean == null ) || partitionBean.isDisabled() )
{
return null;
}
if ( partitionBean instanceof JdbmPartitionBean )
{
return createJdbmPartition( directoryService, ( JdbmPartitionBean ) partitionBean );
}
else if ( partitionBean instanceof MavibotPartitionBean )
{
return createMavibotPartition( directoryService, ( MavibotPartitionBean ) partitionBean );
}
else
{
return null;
}
}
/**
* Create the set of Partitions instantiated from the configuration
*
* @param partitionBeans the list of Partition beans
* @return A Map of all the instantiated partitions
* @throws ConfigurationException If we cannot process some Partition
*/
public static Map<String, Partition> createPartitions( DirectoryService directoryService,
List<PartitionBean> partitionBeans ) throws ConfigurationException
{
Map<String, Partition> partitions = new HashMap<String, Partition>( partitionBeans.size() );
for ( PartitionBean partitionBean : partitionBeans )
{
if ( partitionBean.isDisabled() )
{
continue;
}
Partition partition = createPartition( directoryService, partitionBean );
if ( partition != null )
{
partitions.put( partitionBean.getPartitionId(), partition );
}
}
return partitions;
}
/**
* Instantiates a DirectoryService based on the configuration present in the partition
*
* @param directoryServiceBean The bean containing the configuration
* @param baseDirectory The working path for this DirectoryService
* @return An instance of DirectoryService
* @throws Exception
*/
public static DirectoryService createDirectoryService( DirectoryServiceBean directoryServiceBean,
InstanceLayout instanceLayout, SchemaManager schemaManager ) throws Exception
{
DirectoryService directoryService = new DefaultDirectoryService();
// The schemaManager
directoryService.setSchemaManager( schemaManager );
// MUST attributes
// DirectoryService ID
directoryService.setInstanceId( directoryServiceBean.getDirectoryServiceId() );
// Replica ID
directoryService.setReplicaId( directoryServiceBean.getDsReplicaId() );
// WorkingDirectory
directoryService.setInstanceLayout( instanceLayout );
// Interceptors
List<Interceptor> interceptors = createInterceptors( directoryServiceBean.getInterceptors() );
directoryService.setInterceptors( interceptors );
// Partitions
Map<String, Partition> partitions = createPartitions( directoryService, directoryServiceBean.getPartitions() );
Partition systemPartition = partitions.remove( "system" );
if ( systemPartition == null )
{
//throw new Exception( I18n.err( I18n.ERR_505 ) );
}
directoryService.setSystemPartition( systemPartition );
directoryService.setPartitions( new HashSet<Partition>( partitions.values() ) );
// MAY attributes
// AccessControlEnabled
directoryService.setAccessControlEnabled( directoryServiceBean.isDsAccessControlEnabled() );
// AllowAnonymousAccess
directoryService.setAllowAnonymousAccess( directoryServiceBean.isDsAllowAnonymousAccess() );
// ChangeLog
ChangeLog cl = createChangeLog( directoryServiceBean.getChangeLog() );
if ( cl != null )
{
directoryService.setChangeLog( cl );
}
// DenormalizedOpAttrsEnabled
directoryService.setDenormalizeOpAttrsEnabled( directoryServiceBean.isDsDenormalizeOpAttrsEnabled() );
// Journal
Journal journal = createJournal( directoryServiceBean.getJournal() );
if ( journal != null )
{
directoryService.setJournal( journal );
}
// PasswordHidden
directoryService.setPasswordHidden( directoryServiceBean.isDsPasswordHidden() );
// SyncPeriodMillis
directoryService.setSyncPeriodMillis( directoryServiceBean.getDsSyncPeriodMillis() );
// testEntries
String entryFilePath = directoryServiceBean.getDsTestEntries();
if ( entryFilePath != null )
{
directoryService.setTestEntries( readTestEntries( entryFilePath ) );
}
// Enabled
if ( !directoryServiceBean.isEnabled() )
{
// will only be useful if we ever allow more than one DS to be configured and
// switch between them
// decide which one to use based on this flag
// TODO
}
return directoryService;
}
public static MavibotPartition createMavibotPartition( DirectoryService directoryService,
MavibotPartitionBean mvbtPartitionBean ) throws ConfigurationException
{
if ( ( mvbtPartitionBean == null ) || mvbtPartitionBean.isDisabled() )
{
return null;
}
MavibotPartition mvbtPartition = new MavibotPartition( directoryService.getSchemaManager(),
directoryService.getDnFactory() );
mvbtPartition.setId( mvbtPartitionBean.getPartitionId() );
//mvbtPartition.setOptimizerEnabled( mvbtPartitionBean.isJdbmPartitionOptimizerEnabled() );
File partitionPath = new File( directoryService.getInstanceLayout().getPartitionsDirectory(),
mvbtPartitionBean.getPartitionId() );
mvbtPartition.setPartitionPath( partitionPath.toURI() );
try
{
mvbtPartition.setSuffixDn( mvbtPartitionBean.getPartitionSuffix() );
}
catch ( LdapInvalidDnException lide )
{
String message = "Cannot set the Dn " + mvbtPartitionBean.getPartitionSuffix() + ", " + lide.getMessage();
LOG.error( message );
throw new ConfigurationException( message );
}
mvbtPartition.setSyncOnWrite( mvbtPartitionBean.isPartitionSyncOnWrite() );
mvbtPartition.setIndexedAttributes( createMavibotIndexes( mvbtPartition, mvbtPartitionBean.getIndexes(),
directoryService ) );
setContextEntry( mvbtPartitionBean, mvbtPartition );
return mvbtPartition;
}
/**
* Create the list of MavibotIndex from the configuration
*/
private static Set<Index<?, String>> createMavibotIndexes( MavibotPartition partition,
List<IndexBean> indexesBeans,
DirectoryService directoryService ) //throws Exception
{
Set<Index<?, String>> indexes = new HashSet<Index<?, String>>();
for ( IndexBean indexBean : indexesBeans )
{
if ( indexBean.isEnabled() && ( indexBean instanceof MavibotIndexBean ) )
{
indexes.add( createMavibotIndex( partition, ( MavibotIndexBean ) indexBean, directoryService ) );
}
}
return indexes;
}
/**
* Create a new instance of a MavibotIndex from an instance of MavibotIndexBean
*
* @param MavibotIndexBean The MavibotIndexBean to convert
* @return An MavibotIndex instance
* @throws Exception If the instance cannot be created
*/
public static MavibotIndex<?> createMavibotIndex( MavibotPartition partition,
MavibotIndexBean mavobotIndexBean, DirectoryService directoryService )
{
if ( ( mavobotIndexBean == null ) || mavobotIndexBean.isDisabled() )
{
return null;
}
MavibotIndex<?> index = null;
boolean hasReverse = mavobotIndexBean.getIndexHasReverse();
if ( mavobotIndexBean.getIndexAttributeId().equalsIgnoreCase( ApacheSchemaConstants.APACHE_RDN_AT ) ||
mavobotIndexBean.getIndexAttributeId().equalsIgnoreCase( ApacheSchemaConstants.APACHE_RDN_AT_OID ) )
{
index = new MavibotRdnIndex();
}
else if ( mavobotIndexBean.getIndexAttributeId().equalsIgnoreCase( ApacheSchemaConstants.APACHE_ALIAS_AT ) ||
mavobotIndexBean.getIndexAttributeId().equalsIgnoreCase( ApacheSchemaConstants.APACHE_ALIAS_AT_OID ) )
{
index = new MavibotDnIndex( ApacheSchemaConstants.APACHE_ALIAS_AT_OID );
}
else
{
index = new MavibotIndex<String>( mavobotIndexBean.getIndexAttributeId(), hasReverse );
}
index.setWkDirPath( partition.getPartitionPath() );
return index;
}
/**
* Sets the configured context entry if present in the given partition bean
*
* @param bean the partition configuration bean
* @param partition the partition instance
* @throws ConfigurationException
*/
private static void setContextEntry( PartitionBean bean, AbstractPartition partition )
throws ConfigurationException
{
String contextEntry = bean.getContextEntry();
if ( contextEntry != null )
{
try
{
// Replace '\n' to real LF
String entryStr = contextEntry.replaceAll( "\\\\n", "\n" );
LdifReader ldifReader = new LdifReader();
List<LdifEntry> entries = ldifReader.parseLdif( entryStr );
if ( ( entries != null ) && ( entries.size() > 0 ) )
{
LdifEntry entry = entries.get( 0 );
partition.setContextEntry( entry.getEntry() );
}
try
{
ldifReader.close();
}
catch ( IOException ioe )
{
LOG.error( "Cannot close the ldif reader" );
}
}
catch ( LdapLdifException lle )
{
String message = "Cannot parse the context entry : " + contextEntry + ", " + lle.getMessage();
LOG.error( message );
throw new ConfigurationException( message );
}
}
}
}