blob: e60cb72ec9b86faba8d2854ed7697c3ff75735a3 [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;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import javax.naming.directory.SearchControls;
import org.apache.directory.server.core.DefaultDirectoryService;
import org.apache.directory.server.core.DirectoryService;
import org.apache.directory.server.core.changelog.ChangeLog;
import org.apache.directory.server.core.changelog.DefaultChangeLog;
import org.apache.directory.server.core.entry.ClonedServerEntry;
import org.apache.directory.server.core.entry.ServerEntry;
import org.apache.directory.server.core.interceptor.Interceptor;
import org.apache.directory.server.core.journal.DefaultJournal;
import org.apache.directory.server.core.journal.DefaultJournalStore;
import org.apache.directory.server.core.journal.Journal;
import org.apache.directory.server.core.journal.JournalStore;
import org.apache.directory.server.core.partition.Partition;
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.ldif.LdifPartition;
import org.apache.directory.server.dhcp.service.DhcpService;
import org.apache.directory.server.dhcp.service.StoreBasedDhcpService;
import org.apache.directory.server.dhcp.store.DhcpStore;
import org.apache.directory.server.dhcp.store.SimpleDhcpStore;
import org.apache.directory.server.dns.DnsServer;
import org.apache.directory.server.integration.http.HttpServer;
import org.apache.directory.server.integration.http.WebApp;
import org.apache.directory.server.kerberos.kdc.KdcServer;
import org.apache.directory.server.kerberos.shared.crypto.encryption.EncryptionType;
import org.apache.directory.server.ldap.LdapServer;
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.ForwardIndexEntry;
import org.apache.directory.server.xdbm.Index;
import org.apache.directory.server.xdbm.IndexCursor;
import org.apache.directory.server.xdbm.search.SearchEngine;
import org.apache.directory.shared.ldap.NotImplementedException;
import org.apache.directory.shared.ldap.entry.Entry;
import org.apache.directory.shared.ldap.entry.EntryAttribute;
import org.apache.directory.shared.ldap.entry.Value;
import org.apache.directory.shared.ldap.entry.client.ClientStringValue;
import org.apache.directory.shared.ldap.filter.EqualityNode;
import org.apache.directory.shared.ldap.filter.PresenceNode;
import org.apache.directory.shared.ldap.ldif.LdifEntry;
import org.apache.directory.shared.ldap.ldif.LdifReader;
import org.apache.directory.shared.ldap.message.AliasDerefMode;
import org.apache.directory.shared.ldap.name.LdapDN;
import org.apache.directory.shared.ldap.schema.SchemaManager;
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>
* @version $Rev$, $Date$
*/
public class ConfigPartitionReader
{
/** the partition which holds the configuration data */
private LdifPartition configPartition;
/** the search engine of the partition */
private SearchEngine<ServerEntry> se;
/** the schema manager set in the config partition */
private SchemaManager schemaManager;
/** the parent directory of the config partition's working directory */
private File workDir;
/** LDIF file filter */
private FilenameFilter ldifFilter = new FilenameFilter()
{
public boolean accept( File file, String name )
{
if( file.isDirectory() )
{
return true;
}
return file.getName().toLowerCase().endsWith( ".ldif" );
}
};
private static final Logger LOG = LoggerFactory.getLogger( ConfigPartitionReader.class );
/**
*
* Creates a new instance of ConfigPartitionReader.
*
* @param configPartition the non null config partition
*/
public ConfigPartitionReader( LdifPartition configPartition )
{
if ( configPartition == null )
{
throw new IllegalArgumentException( "Config partition cannot be null" );
}
if ( !configPartition.isInitialized() )
{
throw new IllegalStateException( "the config partition is not initialized" );
}
this.configPartition = configPartition;
se = configPartition.getSearchEngine();
this.schemaManager = configPartition.getSchemaManager();
workDir = configPartition.getPartitionDir().getParentFile();
}
/**
* reads the LDAP server configuration and instantiates without setting a DirectoryService
*
* @return the LdapServer instance without a DirectoryService
* @throws Exception
*/
public LdapServer getLdapServer() throws Exception
{
EqualityNode filter = new EqualityNode( "objectClass", new ClientStringValue( "ads-ldapServer" ) );
SearchControls controls = new SearchControls();
controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
IndexCursor cursor = se.cursor( configPartition.getSuffixDn(), AliasDerefMode.NEVER_DEREF_ALIASES, filter,
controls );
if ( !cursor.next() )
{
LOG.warn( "No LDAP server was configured under the DN {}", configPartition.getSuffixDn() );
return null;
}
ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
cursor.close();
ClonedServerEntry ldapServerEntry = configPartition.lookup( forwardEntry.getId() );
LOG.debug( "LDAP Server Entry {}", ldapServerEntry );
if( !isEnabled( ldapServerEntry ) )
{
return null;
}
LdapServer server = new LdapServer();
server.setServiceId( getString( "ads-serverId", ldapServerEntry ) );
LdapDN transportsDN = new LdapDN( getString( "ads-transports", ldapServerEntry ) );
transportsDN.normalize( schemaManager.getNormalizerMapping() );
Transport[] transports = getTransports( transportsDN );
server.setTransports( transports );
return server;
}
public KdcServer getKdcServer() throws Exception
{
EqualityNode filter = new EqualityNode( "objectClass", new ClientStringValue( "ads-kerberosServer" ) );
SearchControls controls = new SearchControls();
controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
IndexCursor cursor = se.cursor( configPartition.getSuffixDn(), AliasDerefMode.NEVER_DEREF_ALIASES, filter,
controls );
if ( !cursor.next() )
{
LOG.warn( "No kerberos server was configured under the DN {}", configPartition.getSuffixDn() );
return null;
}
ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
cursor.close();
ClonedServerEntry kdcEntry = configPartition.lookup( forwardEntry.getId() );
LOG.debug( "kerberos server entry {}", kdcEntry );
if( !isEnabled( kdcEntry ) )
{
return null;
}
KdcServer kdcServer = new KdcServer();
kdcServer.setServiceId( getString( "ads-serverId", kdcEntry ) );
LdapDN transportsDN = new LdapDN( getString( "ads-transports", kdcEntry ) );
transportsDN.normalize( schemaManager.getNormalizerMapping() );
Transport[] transports = getTransports( transportsDN );
kdcServer.setTransports( transports );
// MAY attributes
EntryAttribute clockSkewAttr = kdcEntry.get( "ads-krbAllowableClockSkew" );
if( clockSkewAttr != null )
{
kdcServer.setAllowableClockSkew( Long.parseLong( clockSkewAttr.getString() ) );
}
EntryAttribute encryptionTypeAttr = kdcEntry.get( "ads-krbEncryptionTypes" );
if( encryptionTypeAttr != null )
{
EncryptionType[] encryptionTypes = new EncryptionType[ encryptionTypeAttr.size() ];
Iterator<Value<?>> itr = encryptionTypeAttr.getAll();
int count = 0;
while( itr.hasNext() )
{
Value<?> val = itr.next();
encryptionTypes[count++] = EncryptionType.getByName( val.getString() );
}
kdcServer.setEncryptionTypes( encryptionTypes );
}
EntryAttribute emptyAddrAttr = kdcEntry.get( "ads-krbEmptyAddressesAllowed" );
if( emptyAddrAttr != null )
{
kdcServer.setEmptyAddressesAllowed( Boolean.parseBoolean( emptyAddrAttr.getString() ) );
}
EntryAttribute fwdAllowedAttr = kdcEntry.get( "ads-krbForwardableAllowed" );
if( fwdAllowedAttr != null )
{
kdcServer.setForwardableAllowed( Boolean.parseBoolean( fwdAllowedAttr.getString() ) );
}
EntryAttribute paEncTmstpAttr = kdcEntry.get( "ads-krbPaEncTimestampRequired" );
if( paEncTmstpAttr != null )
{
kdcServer.setPaEncTimestampRequired( Boolean.parseBoolean( paEncTmstpAttr.getString() ) );
}
EntryAttribute posdtAllowedAttr = kdcEntry.get( "ads-krbPostdatedAllowed" );
if( posdtAllowedAttr != null )
{
kdcServer.setPostdatedAllowed( Boolean.parseBoolean( posdtAllowedAttr.getString() ) );
}
EntryAttribute prxyAllowedAttr = kdcEntry.get( "ads-krbProxiableAllowed" );
if( prxyAllowedAttr != null )
{
kdcServer.setProxiableAllowed( Boolean.parseBoolean( prxyAllowedAttr.getString() ) );
}
EntryAttribute rnwAllowedAttr = kdcEntry.get( "ads-krbRenewableAllowed" );
if( rnwAllowedAttr != null )
{
kdcServer.setRenewableAllowed( Boolean.parseBoolean( rnwAllowedAttr.getString() ) );
}
EntryAttribute kdcPrncplAttr = kdcEntry.get( "ads-krbKdcPrincipal" );
if( kdcPrncplAttr != null )
{
kdcServer.setKdcPrincipal( kdcPrncplAttr.getString() );
}
EntryAttribute maxRnwLfTimeAttr = kdcEntry.get( "ads-krbMaximumRenewableLifetime" );
if( maxRnwLfTimeAttr != null )
{
kdcServer.setMaximumRenewableLifetime( Long.parseLong( maxRnwLfTimeAttr.getString() ) );
}
EntryAttribute maxTcktLfTimeAttr = kdcEntry.get( "ads-krbMaximumTicketLifetime" );
if( maxTcktLfTimeAttr != null )
{
kdcServer.setMaximumTicketLifetime( Long.parseLong( maxTcktLfTimeAttr.getString() ) );
}
EntryAttribute prmRealmAttr = kdcEntry.get( "ads-krbPrimaryRealm" );
if( prmRealmAttr != null )
{
kdcServer.setPrimaryRealm( prmRealmAttr.getString() );
}
EntryAttribute bdyCkhsmVerifyAttr = kdcEntry.get( "ads-krbBodyChecksumVerified" );
if( bdyCkhsmVerifyAttr != null )
{
kdcServer.setBodyChecksumVerified( Boolean.parseBoolean( bdyCkhsmVerifyAttr.getString() ) );
}
return kdcServer;
}
public DnsServer getDnsServer() throws Exception
{
EqualityNode filter = new EqualityNode( "objectClass", new ClientStringValue( "ads-dnsServer" ) );
SearchControls controls = new SearchControls();
controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
IndexCursor cursor = se.cursor( configPartition.getSuffixDn(), AliasDerefMode.NEVER_DEREF_ALIASES, filter,
controls );
if ( !cursor.next() )
{
LOG.warn( "No DNS server was configured under the DN {}", configPartition.getSuffixDn() );
return null;
}
ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
cursor.close();
ClonedServerEntry dnsEntry = configPartition.lookup( forwardEntry.getId() );
LOG.debug( "DNS server entry {}", dnsEntry );
if( !isEnabled( dnsEntry ) )
{
return null;
}
DnsServer dnsServer = new DnsServer();
dnsServer.setServiceId( getString( "ads-serverId", dnsEntry ) );
LdapDN transportsDN = new LdapDN( getString( "ads-transports", dnsEntry ) );
transportsDN.normalize( schemaManager.getNormalizerMapping() );
Transport[] transports = getTransports( transportsDN );
dnsServer.setTransports( transports );
return dnsServer;
}
//TODO making this method invisible cause there is no DhcpServer exists as of now
private DhcpService getDhcpServer() throws Exception
{
EqualityNode filter = new EqualityNode( "objectClass", new ClientStringValue( "ads-dhcpServer" ) );
SearchControls controls = new SearchControls();
controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
IndexCursor cursor = se.cursor( configPartition.getSuffixDn(), AliasDerefMode.NEVER_DEREF_ALIASES, filter,
controls );
if ( !cursor.next() )
{
LOG.warn( "No DHCP server was configured under the DN {}", configPartition.getSuffixDn() );
return null;
}
ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
cursor.close();
ClonedServerEntry dhcpEntry = configPartition.lookup( forwardEntry.getId() );
LOG.debug( "DHCP server entry {}", dhcpEntry );
if( !isEnabled( dhcpEntry ) )
{
return null;
}
DhcpStore dhcpStore = new SimpleDhcpStore();
DhcpService dhcpService = new StoreBasedDhcpService( dhcpStore );
return dhcpService;
}
public NtpServer getNtpServer() throws Exception
{
EqualityNode filter = new EqualityNode( "objectClass", new ClientStringValue( "ads-ntpServer" ) );
SearchControls controls = new SearchControls();
controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
IndexCursor cursor = se.cursor( configPartition.getSuffixDn(), AliasDerefMode.NEVER_DEREF_ALIASES, filter,
controls );
if ( !cursor.next() )
{
LOG.warn( "No NTP server was configured under the DN {}", configPartition.getSuffixDn() );
return null;
}
ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
cursor.close();
ClonedServerEntry ntpEntry = configPartition.lookup( forwardEntry.getId() );
LOG.debug( "NTP server entry {}", ntpEntry );
if( !isEnabled( ntpEntry ) )
{
return null;
}
NtpServer ntpServer = new NtpServer();
ntpServer.setServiceId( getString( "ads-serverId", ntpEntry ) );
LdapDN transportsDN = new LdapDN( getString( "ads-transports", ntpEntry ) );
transportsDN.normalize( schemaManager.getNormalizerMapping() );
Transport[] transports = getTransports( transportsDN );
ntpServer.setTransports( transports );
return ntpServer;
}
public HttpServer getHttpServer() throws Exception
{
EqualityNode filter = new EqualityNode( "objectClass", new ClientStringValue( "ads-httpServer" ) );
SearchControls controls = new SearchControls();
controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
IndexCursor cursor = se.cursor( configPartition.getSuffixDn(), AliasDerefMode.NEVER_DEREF_ALIASES, filter,
controls );
if ( !cursor.next() )
{
LOG.warn( "No HTTP server was configured under the DN {}", configPartition.getSuffixDn() );
return null;
}
ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
cursor.close();
ClonedServerEntry httpEntry = configPartition.lookup( forwardEntry.getId() );
LOG.debug( "HTTP server entry {}", httpEntry );
if( !isEnabled( httpEntry ) )
{
return null;
}
HttpServer httpServer = new HttpServer();
EntryAttribute portAttr = httpEntry.get( "ads-systemPort" );
if( portAttr != null )
{
httpServer.setPort( Integer.parseInt( portAttr.getString() ) );
}
EntryAttribute confFileAttr = httpEntry.get( "ads-httpConfFile" );
if( confFileAttr != null )
{
httpServer.setConfFile( confFileAttr.getString() );
}
EntryAttribute webAppsAttr = httpEntry.get( "ads-httpWebApps" );
if( webAppsAttr != null )
{
LdapDN webAppsDN = new LdapDN( webAppsAttr.getString() );
webAppsDN.normalize( schemaManager.getNormalizerMapping() );
Set<WebApp> webApps = getWebApps( webAppsDN );
httpServer.setWebApps( webApps );
}
return httpServer;
}
/**
*
* instantiates a DirectoryService based on the configuration present in the partition
*
* @throws Exception
*/
public DirectoryService getDirectoryService() throws Exception
{
PresenceNode filter = new PresenceNode( "ads-directoryServiceId" );
SearchControls controls = new SearchControls();
controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
IndexCursor cursor = se.cursor( configPartition.getSuffixDn(), AliasDerefMode.NEVER_DEREF_ALIASES, filter,
controls );
if ( !cursor.next() )
{
// the DirectoryService is mandatory so throwing exception
throw new Exception( "No directoryService instance was configured under the DN "
+ configPartition.getSuffixDn() );
}
ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
cursor.close();
ClonedServerEntry dsEntry = configPartition.lookup( forwardEntry.getId() );
LOG.debug( "directory service entry {}", dsEntry );
DirectoryService dirService = new DefaultDirectoryService();
// MUST attributes
dirService.setInstanceId( getString( "ads-directoryServiceId", dsEntry ) );
dirService.setReplicaId( getInt( "ads-dsReplicaId", dsEntry ) );
LdapDN interceptorsDN = new LdapDN( dsEntry.get( "ads-dsInterceptors" ).getString() );
interceptorsDN.normalize( configPartition.getSchemaManager().getNormalizerMapping() );
List<Interceptor> interceptors = getInterceptors( interceptorsDN );
dirService.setInterceptors( interceptors );
LdapDN partitionsDN = new LdapDN( dsEntry.get( "ads-dsPartitions" ).getString() );
partitionsDN.normalize( configPartition.getSchemaManager().getNormalizerMapping() );
Map<String, Partition> partitions = getPartitions( partitionsDN );
Partition systemPartition = partitions.remove( "system" );
if( systemPartition == null )
{
throw new Exception( "system partition doesn't exist" );
}
dirService.setSystemPartition( systemPartition );
dirService.setPartitions( new HashSet( partitions.values() ) );
// MAY attributes
EntryAttribute acEnabledAttr = dsEntry.get( "ads-dsAccessControlEnabled" );
if ( acEnabledAttr != null )
{
dirService.setAccessControlEnabled( Boolean.parseBoolean( acEnabledAttr.getString() ) );
}
EntryAttribute anonAccessAttr = dsEntry.get( "ads-dsAllowAnonymousAccess" );
if ( anonAccessAttr != null )
{
dirService.setAllowAnonymousAccess( Boolean.parseBoolean( anonAccessAttr.getString() ) );
}
EntryAttribute changeLogAttr = dsEntry.get( "ads-dsChangeLog" );
if ( changeLogAttr != null )
{
LdapDN clDN = new LdapDN( changeLogAttr.getString() );
clDN.normalize( schemaManager.getNormalizerMapping() );
ChangeLog cl = getChangeLog( clDN );
dirService.setChangeLog( cl );
}
EntryAttribute denormAttr = dsEntry.get( "ads-dsDenormalizeOpAttrsEnabled" );
if ( denormAttr != null )
{
dirService.setDenormalizeOpAttrsEnabled( Boolean.parseBoolean( denormAttr.getString() ) );
}
EntryAttribute journalAttr = dsEntry.get( "ads-dsJournal" );
if ( journalAttr != null )
{
LdapDN journalDN = new LdapDN( journalAttr.getString() );
journalDN.normalize( schemaManager.getNormalizerMapping() );
dirService.setJournal( getJournal( journalDN ) );
}
EntryAttribute maxPduAttr = dsEntry.get( "ads-dsMaxPDUSize" );
if ( maxPduAttr != null )
{
dirService.setMaxPDUSize( Integer.parseInt( maxPduAttr.getString() ) );
}
EntryAttribute passwordHidAttr = dsEntry.get( "ads-dsPasswordHidden" );
if ( passwordHidAttr != null )
{
dirService.setPasswordHidden( Boolean.parseBoolean( passwordHidAttr.getString() ) );
}
EntryAttribute replAttr = dsEntry.get( "ads-dsReplication" );
if ( replAttr != null )
{
// configure replication
}
EntryAttribute syncPeriodAttr = dsEntry.get( "ads-dsSyncPeriodMillis" );
if ( syncPeriodAttr != null )
{
// FIXME the DirectoryService interface doesn't have this setter
//dirService.setSyncPeriodMillis( Long.parseLong( syncPeriodAttr.getString() ) );
}
EntryAttribute testEntryAttr = dsEntry.get( "ads-dsTestEntries" );
if ( testEntryAttr != null )
{
String entryFilePath = testEntryAttr.getString();
dirService.setTestEntries( getTestEntries( entryFilePath ) );
}
if ( !isEnabled( dsEntry ) )
{
// 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
}
return dirService;
}
/**
* reads the Interceptor configuration and instantiates them in the order specified
*
* @param interceptorsDN the DN under which interceptors are configured
* @return a list of instantiated Interceptor objects
* @throws Exception
*/
private List<Interceptor> getInterceptors( LdapDN interceptorsDN ) throws Exception
{
PresenceNode filter = new PresenceNode( "ads-interceptorId" );
SearchControls controls = new SearchControls();
controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
IndexCursor cursor = se.cursor( interceptorsDN, AliasDerefMode.NEVER_DEREF_ALIASES, filter, controls );
Set<InterceptorConfig> set = new TreeSet<InterceptorConfig>();
while ( cursor.next() )
{
ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
ServerEntry interceptorEntry = configPartition.lookup( forwardEntry.getId() );
String id = getString( "ads-interceptorId", interceptorEntry );
String fqcn = getString( "ads-interceptorClassName", interceptorEntry );
int order = getInt( "ads-interceptorOrder", interceptorEntry );
InterceptorConfig intConfig = new InterceptorConfig( id, fqcn, order );
set.add( intConfig );
}
cursor.close();
List<Interceptor> interceptors = new ArrayList<Interceptor>();
for( InterceptorConfig iconfig : set )
{
try
{
LOG.debug( "loading the interceptor class {} and instantiating", iconfig.getFqcn() );
Interceptor ic = ( Interceptor ) Class.forName( iconfig.getFqcn() ).newInstance();
interceptors.add( ic );
}
catch( Exception e )
{
throw e;
}
}
return interceptors;
}
private Map<String,Partition> getPartitions( LdapDN partitionsDN ) throws Exception
{
PresenceNode filter = new PresenceNode( "ads-partitionId" );
SearchControls controls = new SearchControls();
controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
IndexCursor cursor = se.cursor( partitionsDN, AliasDerefMode.NEVER_DEREF_ALIASES, filter, controls );
Map<String,Partition> partitions = new HashMap<String,Partition>();
while( cursor.next() )
{
ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
ServerEntry partitionEntry = configPartition.lookup( forwardEntry.getId() );
if( !isEnabled( partitionEntry ) )
{
continue;
}
EntryAttribute ocAttr = partitionEntry.get( "objectClass" );
if( ocAttr.contains( "ads-jdbmPartition" ) )
{
JdbmPartition partition = getJdbmPartition( partitionEntry );
partitions.put( partition.getId(), partition );
}
else
{
throw new NotImplementedException( "yet to implement" );
}
}
cursor.close();
return partitions;
}
private JdbmPartition getJdbmPartition( ServerEntry partitionEntry ) throws Exception
{
JdbmPartition partition = new JdbmPartition();
partition.setSchemaManager( schemaManager );
partition.setId( getString( "ads-partitionId", partitionEntry ) );
partition.setPartitionDir( new File( workDir, partition.getId() ) );
partition.setSuffix( getString( "ads-partitionSuffix", partitionEntry ) );
EntryAttribute cacheAttr = partitionEntry.get( "ads-partitionCacheSize" );
if( cacheAttr != null )
{
partition.setCacheSize( Integer.parseInt( cacheAttr.getString() ) );
}
EntryAttribute optimizerAttr = partitionEntry.get( "ads-jdbmPartitionOptimizerEnabled" );
if( optimizerAttr != null )
{
partition.setOptimizerEnabled( Boolean.parseBoolean( optimizerAttr.getString() ) );
}
EntryAttribute syncAttr = partitionEntry.get( "ads-partitionSyncOnWrite" );
if( syncAttr != null )
{
partition.setSyncOnWrite( Boolean.parseBoolean( syncAttr.getString() ) );
}
String indexesDN = partitionEntry.get( "ads-partitionIndexedAttributes" ).getString();
Set<Index<?,ServerEntry>> indexedAttributes = getIndexes( new LdapDN( indexesDN ) );
partition.setIndexedAttributes( indexedAttributes );
return partition;
}
private Set<Index<?,ServerEntry>> getIndexes( LdapDN indexesDN ) throws Exception
{
PresenceNode filter = new PresenceNode( "ads-indexAttributeId" );
SearchControls controls = new SearchControls();
controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
IndexCursor cursor = se.cursor( indexesDN, AliasDerefMode.NEVER_DEREF_ALIASES, filter, controls );
Set<Index<?,ServerEntry>> indexes = new HashSet<Index<?,ServerEntry>>();
while( cursor.next() )
{
ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
ServerEntry indexEntry = configPartition.lookup( forwardEntry.getId() );
if( !isEnabled( indexEntry ) )
{
continue;
}
EntryAttribute ocAttr = indexEntry.get( "objectClass" );
if( ocAttr.contains( "ads-jdbmIndex" ) )
{
indexes.add( getJdbmIndex( indexEntry ) );
}
else
{
throw new NotImplementedException( "yet to implement" );
}
}
return indexes;
}
private JdbmIndex<?, ServerEntry> getJdbmIndex( ServerEntry indexEntry ) throws Exception
{
JdbmIndex<?, ServerEntry> index = new JdbmIndex();
index.setAttributeId( getString( "ads-indexAttributeId", indexEntry ) );
EntryAttribute cacheAttr = indexEntry.get( "ads-indexCacheSize" );
if( cacheAttr != null )
{
index.setCacheSize( Integer.parseInt( cacheAttr.getString() ) );
}
return index;
}
private Transport[] getTransports( LdapDN transportsDN ) throws Exception
{
PresenceNode filter = new PresenceNode( "ads-transportId" );
SearchControls controls = new SearchControls();
controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
IndexCursor cursor = se.cursor( transportsDN, AliasDerefMode.NEVER_DEREF_ALIASES, filter, controls );
List<Transport> transports = new ArrayList<Transport>();
while( cursor.next() )
{
ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
ServerEntry transportEntry = configPartition.lookup( forwardEntry.getId() );
if( !isEnabled( transportEntry ) )
{
continue;
}
transports.add( getTransport( transportEntry ) );
}
return transports.toArray( new Transport[]{} );
}
private Transport getTransport( Entry transportEntry ) throws Exception
{
Transport transport = null;
EntryAttribute ocAttr = transportEntry.get( "objectClass" );
if( ocAttr.contains( "ads-tcpTransport" ) )
{
transport = new TcpTransport();
}
else if( ocAttr.contains( "ads-udpTransport" ) )
{
transport = new UdpTransport();
}
transport.setPort( getInt( "ads-systemPort", transportEntry ) );
EntryAttribute addressAttr = transportEntry.get( "ads-transportAddress" );
if( addressAttr != null )
{
transport.setAddress( addressAttr.getString() );
}
else
{
transport.setAddress( "0.0.0.0" );
}
EntryAttribute backlogAttr = transportEntry.get( "ads-transportBacklog" );
if( backlogAttr != null )
{
transport.setBackLog( Integer.parseInt( backlogAttr.getString() ) );
}
EntryAttribute sslAttr = transportEntry.get( "ads-transportEnableSSL" );
if( sslAttr != null )
{
transport.setEnableSSL( Boolean.parseBoolean( sslAttr.getString() ) );
}
EntryAttribute nbThreadsAttr = transportEntry.get( "ads-transportNbThreads" );
if( nbThreadsAttr != null )
{
transport.setNbThreads( Integer.parseInt( nbThreadsAttr.getString() ) );
}
return transport;
}
private ChangeLog getChangeLog( LdapDN changelogDN ) throws Exception
{
Long id = configPartition.getEntryId( changelogDN.getNormName() );
Entry clEntry = configPartition.lookup( id );
ChangeLog cl = new DefaultChangeLog();
EntryAttribute clEnabledAttr =clEntry.get( "ads-changeLogEnabled" );
if( clEnabledAttr != null )
{
cl.setEnabled( Boolean.parseBoolean( clEnabledAttr.getString() ) );
}
EntryAttribute clExpAttr = clEntry.get( "ads-changeLogExposed" );
if( clExpAttr != null )
{
cl.setExposed( Boolean.parseBoolean( clExpAttr.getString() ) );
}
return cl;
}
private Journal getJournal( LdapDN journalDN ) throws Exception
{
Long id = configPartition.getEntryId( journalDN.getNormName() );
Entry jlEntry = configPartition.lookup( id );
Journal journal = new DefaultJournal();
JournalStore store = new DefaultJournalStore();
store.setFileName( getString( "ads-journalFileName", jlEntry ) );
EntryAttribute jlWorkDirAttr = jlEntry.get( "ads-journalWorkingDir" );
if( jlWorkDirAttr != null )
{
store.setWorkingDirectory( jlWorkDirAttr.getString() );
}
EntryAttribute jlRotAttr = jlEntry.get( "ads-journalRotation" );
if( jlRotAttr != null )
{
journal.setRotation( Integer.parseInt( jlRotAttr.getString() ) );
}
EntryAttribute jlEnabledAttr = jlEntry.get( "ads-journalEnabled" );
if( jlEnabledAttr != null )
{
journal.setEnabled( Boolean.parseBoolean( jlEnabledAttr.getString() ) );
}
journal.setJournalStore( store );
return journal;
}
private List<LdifEntry> getTestEntries( String entryFilePath ) throws Exception
{
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.info( "parsing the LDIF file(s) present at the path {}", entryFilePath );
loadEntries( file, entries );
}
return entries;
}
private void loadEntries( File ldifFile, List<LdifEntry> entries ) throws Exception
{
if( ldifFile.isDirectory() )
{
File[] files = ldifFile.listFiles( ldifFilter );
for( File f : files )
{
loadEntries( f, entries );
}
}
else
{
LdifReader reader = new LdifReader();
entries.addAll( reader.parseLdifFile( ldifFile.getAbsolutePath() ) );
reader.close();
}
}
private Set<WebApp> getWebApps( LdapDN webAppsDN ) throws Exception
{
PresenceNode filter = new PresenceNode( "ads-httpWarFile" );
SearchControls controls = new SearchControls();
controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
IndexCursor cursor = se.cursor( webAppsDN, AliasDerefMode.NEVER_DEREF_ALIASES, filter, controls );
Set<WebApp> webApps = new HashSet<WebApp>();
while( cursor.next() )
{
ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
ServerEntry webAppEntry = configPartition.lookup( forwardEntry.getId() );
WebApp app = new WebApp();
app.setWarFile( getString( "ads-httpWarFile", webAppEntry ) );
EntryAttribute ctxPathAttr = webAppEntry.get( "ads-httpAppCtxPath" );
if( ctxPathAttr != null )
{
app.setContextPath( ctxPathAttr.getString() );
}
webApps.add( app );
}
return webApps;
}
/**
* internal class used for holding the Interceptor classname and order configuration
*/
private class InterceptorConfig implements Comparable<InterceptorConfig>
{
private String id;
private String fqcn;
private int order;
public InterceptorConfig( String id, String fqcn, int order )
{
if( order < 1 )
{
throw new IllegalArgumentException( "Invalid interceptor order" );
}
this.id = id;
this.fqcn = fqcn;
this.order = order;
}
public int compareTo( InterceptorConfig o )
{
if ( order > o.order )
{
return 1;
}
else if ( order < o.order )
{
return -1;
}
return 0;
}
/**
* @return the fqcn
*/
public String getFqcn()
{
return fqcn;
}
}
private String getString( String attrName, Entry entry ) throws Exception
{
return entry.get( attrName ).getString();
}
private int getInt( String attrName, Entry entry ) throws Exception
{
return Integer.parseInt( entry.get( attrName ).getString() );
}
private boolean isEnabled( Entry entry ) throws Exception
{
EntryAttribute enabledAttr = entry.get( "ads-enabled" );
if( enabledAttr != null )
{
return Boolean.parseBoolean( enabledAttr.getString() );
}
else
{
return true;
}
}
}