You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2005/06/24 05:20:15 UTC
svn commit: r201553 -
/directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/DefaultContextFactoryConfiguration.java
Author: trustin
Date: Thu Jun 23 20:20:14 2005
New Revision: 201553
URL: http://svn.apache.org/viewcvs?rev=201553&view=rev
Log:
Merged DefaultContextFactoryConfiguration which failed thanks to SVN problem.
Modified:
directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/DefaultContextFactoryConfiguration.java
Modified: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/DefaultContextFactoryConfiguration.java
URL: http://svn.apache.org/viewcvs/directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/DefaultContextFactoryConfiguration.java?rev=201553&r1=201552&r2=201553&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/DefaultContextFactoryConfiguration.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/DefaultContextFactoryConfiguration.java Thu Jun 23 20:20:14 2005
@@ -16,637 +16,74 @@
*/
package org.apache.ldap.server.jndi;
-import java.io.File;
-import java.util.ArrayList;
import java.util.Hashtable;
-import java.util.Iterator;
import javax.naming.Context;
-import javax.naming.Name;
import javax.naming.NamingException;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.Attributes;
-import org.apache.ldap.common.exception.LdapAuthenticationNotSupportedException;
-import org.apache.ldap.common.exception.LdapConfigurationException;
-import org.apache.ldap.common.exception.LdapNoPermissionException;
-import org.apache.ldap.common.message.LockableAttributesImpl;
-import org.apache.ldap.common.message.ResultCodeEnum;
-import org.apache.ldap.common.name.DnParser;
-import org.apache.ldap.common.name.LdapName;
-import org.apache.ldap.common.name.NameComponentNormalizer;
-import org.apache.ldap.common.schema.AttributeType;
-import org.apache.ldap.common.schema.Normalizer;
-import org.apache.ldap.common.util.DateUtils;
-import org.apache.ldap.server.ApplicationPartition;
-import org.apache.ldap.server.ContextPartition;
-import org.apache.ldap.server.PartitionNexus;
-import org.apache.ldap.server.RootNexus;
-import org.apache.ldap.server.SystemPartition;
-import org.apache.ldap.server.configuration.Configuration;
-import org.apache.ldap.server.configuration.ContextPartitionConfiguration;
import org.apache.ldap.server.configuration.StartupConfiguration;
-import org.apache.ldap.server.db.Database;
-import org.apache.ldap.server.db.DefaultSearchEngine;
-import org.apache.ldap.server.db.ExpressionEnumerator;
-import org.apache.ldap.server.db.ExpressionEvaluator;
-import org.apache.ldap.server.db.SearchEngine;
-import org.apache.ldap.server.db.jdbm.JdbmDatabase;
import org.apache.ldap.server.interceptor.InterceptorChain;
-import org.apache.ldap.server.interceptor.InterceptorContext;
-import org.apache.ldap.server.invocation.Invocation;
-import org.apache.ldap.server.schema.AttributeTypeRegistry;
-import org.apache.ldap.server.schema.ConcreteNameComponentNormalizer;
+import org.apache.ldap.server.partition.ContextPartitionNexus;
import org.apache.ldap.server.schema.GlobalRegistries;
-import org.apache.ldap.server.schema.MatchingRuleRegistry;
-import org.apache.ldap.server.schema.OidRegistry;
-import org.apache.ldap.server.schema.bootstrap.BootstrapRegistries;
-import org.apache.ldap.server.schema.bootstrap.BootstrapSchemaLoader;
/**
- * Provides everything required to {@link AbstractContextFactory}.
- * FIXME Rename to DefaultContextFactoryContext
+ * Default implementation of {@link ContextFactoryConfiguration}.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$
*/
class DefaultContextFactoryConfiguration implements ContextFactoryConfiguration
{
- private AbstractContextFactory factory;
+ private DefaultContextFactoryService parent;
- /** the initial context environment that fired up the backend subsystem */
- private Hashtable environment;
-
- /** the configuration */
- private StartupConfiguration configuration;
-
- /** the system partition used by the context factory */
- private SystemPartition systemPartition;
-
- /** the registries for system schema objects */
- private GlobalRegistries globalRegistries;
-
- /** the root nexus */
- private RootNexus rootNexus;
-
- /** whether or not server is started for the first time */
- private boolean firstStart;
-
- /** The interceptor (or interceptor chain) for this provider */
- private InterceptorChain interceptorChain;
-
- /** PartitionNexus proxy wrapping nexus to inject services */
- private final PartitionNexus proxy = new RootNexusProxy(this);
-
- /** whether or not this instance has been shutdown */
- private boolean started = false;
-
-
- // ------------------------------------------------------------------------
- // Constructor
- // ------------------------------------------------------------------------
-
- /**
- * Creates a new instance.
- */
- public DefaultContextFactoryConfiguration()
+ DefaultContextFactoryConfiguration( DefaultContextFactoryService parent )
{
- // Register shutdown hook.
- Runtime.getRuntime().addShutdownHook( new Thread( new Runnable() {
- public void run()
- {
- try
- {
- shutdown();
- }
- catch( NamingException e )
- {
- e.printStackTrace();
- }
- }
- }, "ApacheDS Shutdown Hook" ) );
+ this.parent = parent;
}
- // ------------------------------------------------------------------------
- // BackendSubsystem Interface Method Implemetations
- // ------------------------------------------------------------------------
-
- public Context getJndiContext( String rootDN ) throws NamingException
+ public ContextFactoryServiceListener getServiceListener()
{
- return this.getJndiContext( null, null, "none", rootDN );
- }
-
- public synchronized Context getJndiContext( String principal, byte[] credential, String authentication, String rootDN ) throws NamingException
- {
- checkSecuritySettings( principal, credential, authentication );
-
- if ( !started )
- {
- return new DeadContext();
- }
-
- Hashtable environment = getEnvironment();
- if( principal != null )
- {
- environment.put( Context.SECURITY_PRINCIPAL, principal );
- }
-
- if( credential != null )
- {
- environment.put( Context.SECURITY_CREDENTIALS, credential );
- }
-
- if( authentication != null )
- {
- environment.put( Context.SECURITY_AUTHENTICATION, authentication );
- }
-
- if( rootDN == null )
- {
- rootDN = "";
- }
- environment.put( Context.PROVIDER_URL, rootDN );
-
- return new ServerLdapContext( proxy, environment );
- }
-
- public synchronized void startup( AbstractContextFactory factory, Hashtable env ) throws NamingException
- {
- if( started )
- {
- return;
- }
-
- StartupConfiguration cfg = ( StartupConfiguration ) Configuration.toConfiguration( env );
-
- env.put( Context.PROVIDER_URL, "" );
-
- cfg.validate();
- this.environment = env;
- this.configuration = cfg;
-
- factory.beforeStartup( this );
- try
- {
- initialize();
- firstStart = createBootstrapEntries();
- createTestEntries();
- this.factory = factory;
- started = true;
- }
- finally
- {
- factory.afterStartup( this );
- }
- }
-
- public synchronized void sync() throws NamingException
- {
- if ( !started )
- {
- return;
- }
-
- factory.beforeSync( this );
- try
- {
- this.rootNexus.sync();
- }
- finally
- {
- factory.afterSync( this );
- }
+ return parent.getServiceListener();
}
-
- public synchronized void shutdown() throws NamingException
- {
- if ( !started )
- {
- return;
- }
-
- factory.beforeShutdown( this );
- try
- {
- this.rootNexus.sync();
- this.rootNexus.close();
- this.interceptorChain.destroy();
- this.started = false;
- }
- finally
- {
- environment = null;
- interceptorChain = null;
- configuration = null;
- factory.afterShutdown( this );
- }
- }
-
-
public Hashtable getEnvironment()
{
- return ( Hashtable ) environment.clone();
+ return parent.getEnvironment();
}
- public StartupConfiguration getConfiguration()
+ public StartupConfiguration getStartupConfiguration()
{
- return configuration;
+ return parent.getStartupConfiguration();
}
- public SystemPartition getSystemPartition()
- {
- return systemPartition;
- }
-
public GlobalRegistries getGlobalRegistries()
{
- return globalRegistries;
+ return parent.getGlobalRegistries();
}
- public RootNexus getRootNexus()
- {
- return rootNexus;
- }
-
- public boolean isFirstStart()
+ public ContextPartitionNexus getPartitionNexus()
{
- return firstStart;
+ return parent.getPartitionNexus();
}
- public boolean isStarted()
+ public InterceptorChain getInterceptorChain()
{
- return started;
+ return parent.getInterceptorChain();
}
- public Object invoke( Invocation call ) throws NamingException
- {
- if( !started )
- {
- throw new IllegalStateException( "ApacheDS is not started yet." );
- }
-
- interceptorChain.process( call );
- return call.getReturnValue();
- }
-
- /**
- * Checks to make sure security environment parameters are set correctly.
- *
- * @throws javax.naming.NamingException if the security settings are not correctly configured.
- */
- private void checkSecuritySettings( String principal, byte[] credential, String authentication ) throws NamingException
- {
- if( authentication == null )
- {
- authentication = "";
- }
-
- /*
- * If bind is simple make sure we have the credentials and the
- * principal name set within the environment, otherwise complain
- */
- if ( "simple".equalsIgnoreCase( authentication ) )
- {
- if ( credential == null )
- {
- throw new LdapConfigurationException( "missing required "
- + Context.SECURITY_CREDENTIALS + " property for simple authentication" );
- }
-
- if ( principal == null )
- {
- throw new LdapConfigurationException( "missing required "
- + Context.SECURITY_PRINCIPAL + " property for simple authentication" );
- }
- }
- /*
- * If bind is none make sure credentials and the principal
- * name are NOT set within the environment, otherwise complain
- */
- else if ( "none".equalsIgnoreCase( authentication ) )
- {
- if ( credential != null )
- {
- throw new LdapConfigurationException( "ambiguous bind "
- + "settings encountered where bind is anonymous yet "
- + Context.SECURITY_CREDENTIALS + " property is set" );
- }
- if ( principal != null )
- {
- throw new LdapConfigurationException( "ambiguous bind "
- + "settings encountered where bind is anonymous yet "
- + Context.SECURITY_PRINCIPAL + " property is set" );
- }
-
- if( !configuration.isAllowAnonymousAccess() )
- {
- throw new LdapNoPermissionException( "Anonymous access disabled." );
- }
- }
- else
- {
- /*
- * If bind is anything other than simple or none we need to
- * complain because SASL is not a supported auth method yet
- */
- throw new LdapAuthenticationNotSupportedException( "Unknown authentication type: '" + authentication + "'", ResultCodeEnum.AUTHMETHODNOTSUPPORTED );
- }
- }
-
-
- /**
- * Returns true if we had to create the bootstrap entries on the first
- * start of the server. Otherwise if all entries exist, meaning none
- * had to be created, then we are not starting for the first time.
- *
- * @throws javax.naming.NamingException
- */
- private boolean createBootstrapEntries() throws NamingException
- {
- boolean firstStart = false;
-
- // -------------------------------------------------------------------
- // create admin entry
- // -------------------------------------------------------------------
-
- /*
- * If the admin entry is there, then the database was already created
- */
- if ( !rootNexus.hasEntry( SystemPartition.ADMIN_PRINCIPAL_NAME ) )
- {
- firstStart = true;
-
- Attributes attributes = new LockableAttributesImpl();
- attributes.put( "objectClass", "top" );
- attributes.put( "objectClass", "person" );
- attributes.put( "objectClass", "organizationalPerson" );
- attributes.put( "objectClass", "inetOrgPerson" );
- attributes.put( "uid", SystemPartition.ADMIN_UID );
- attributes.put( "userPassword", SystemPartition.ADMIN_PW );
- attributes.put( "displayName", "Directory Superuser" );
- attributes.put( "creatorsName", SystemPartition.ADMIN_PRINCIPAL );
- attributes.put( "createTimestamp", DateUtils.getGeneralizedTime() );
- attributes.put( "displayName", "Directory Superuser" );
-
- rootNexus.add( SystemPartition.ADMIN_PRINCIPAL, SystemPartition.ADMIN_PRINCIPAL_NAME, attributes );
- }
-
- // -------------------------------------------------------------------
- // create system users area
- // -------------------------------------------------------------------
-
- if ( !rootNexus.hasEntry( new LdapName( "ou=users,ou=system" ) ) )
- {
- firstStart = true;
-
- Attributes attributes = new LockableAttributesImpl();
- attributes.put( "objectClass", "top" );
- attributes.put( "objectClass", "organizationalUnit" );
- attributes.put( "ou", "users" );
- attributes.put( "creatorsName", SystemPartition.ADMIN_PRINCIPAL );
- attributes.put( "createTimestamp", DateUtils.getGeneralizedTime() );
-
- rootNexus.add( "ou=users,ou=system", new LdapName( "ou=users,ou=system" ), attributes );
- }
-
- // -------------------------------------------------------------------
- // create system groups area
- // -------------------------------------------------------------------
-
- if ( !rootNexus.hasEntry( new LdapName( "ou=groups,ou=system" ) ) )
- {
- firstStart = true;
-
- Attributes attributes = new LockableAttributesImpl();
- attributes.put( "objectClass", "top" );
- attributes.put( "objectClass", "organizationalUnit" );
- attributes.put( "ou", "groups" );
- attributes.put( "creatorsName", SystemPartition.ADMIN_PRINCIPAL );
- attributes.put( "createTimestamp", DateUtils.getGeneralizedTime() );
-
- rootNexus.add( "ou=groups,ou=system", new LdapName( "ou=groups,ou=system" ), attributes );
- }
-
- // -------------------------------------------------------------------
- // create system preferences area
- // -------------------------------------------------------------------
-
- if ( !rootNexus.hasEntry( new LdapName( "prefNodeName=sysPrefRoot,ou=system" ) ) )
- {
- firstStart = true;
-
- Attributes attributes = new LockableAttributesImpl();
- attributes.put( "objectClass", "top" );
- attributes.put( "objectClass", "prefNode" );
- attributes.put( "objectClass", "extensibleObject" );
- attributes.put( "prefNodeName", "sysPrefRoot" );
- attributes.put( "creatorsName", SystemPartition.ADMIN_PRINCIPAL );
- attributes.put( "createTimestamp", DateUtils.getGeneralizedTime() );
-
- LdapName dn = new LdapName( "prefNodeName=sysPrefRoot,ou=system" );
-
- rootNexus.add( "prefNodeName=sysPrefRoot,ou=system", dn, attributes );
- }
-
- return firstStart;
- }
-
-
- private void createTestEntries() throws NamingException
+ public boolean isFirstStart()
{
- /*
- * Unfortunately to test non-root user startup of the core and make sure
- * all the appropriate functionality is there we need to load more user
- * entries at startup due to a chicken and egg like problem. The value
- * of this property is a list of attributes to be added.
- */
- Iterator i = configuration.getTestEntries().iterator();
- while( i.hasNext() )
- {
- Attributes entry = ( Attributes ) i.next();
- entry.put( "creatorsName", SystemPartition.ADMIN_PRINCIPAL );
- entry.put( "createTimestamp", DateUtils.getGeneralizedTime() );
-
- Attribute dn = ( Attribute ) entry.get( "dn" ).clone();
- AttributeTypeRegistry registry = globalRegistries.getAttributeTypeRegistry();
- NameComponentNormalizer ncn = new ConcreteNameComponentNormalizer( registry );
- DnParser parser = new DnParser( ncn );
- Name ndn = parser.parse( ( String ) dn.get() );
-
- rootNexus.add( ( String ) dn.get(), ndn, entry );
- }
+ return parent.isFirstStart();
}
- /**
- * Kicks off the initialization of the entire system.
- *
- * @throws javax.naming.NamingException if there are problems along the way
- */
- private void initialize() throws NamingException
+ public Context getJndiContext( String baseName ) throws NamingException
{
- // --------------------------------------------------------------------
- // Load the schema here and check that it is ok!
- // --------------------------------------------------------------------
-
- BootstrapRegistries bootstrapRegistries = new BootstrapRegistries();
-
- BootstrapSchemaLoader loader = new BootstrapSchemaLoader();
- loader.load( configuration.getBootstrapSchemas(), bootstrapRegistries );
-
- java.util.List errors = bootstrapRegistries.checkRefInteg();
- if ( !errors.isEmpty() )
- {
- NamingException e = new NamingException();
-
- e.setRootCause( ( Throwable ) errors.get( 0 ) );
-
- throw e;
- }
-
- // --------------------------------------------------------------------
- // Fire up the system partition
- // --------------------------------------------------------------------
-
- File workDir = configuration.getWorkingDirectory();
-
- LdapName suffix = new LdapName();
- suffix.add( SystemPartition.SUFFIX );
-
- Database db = new JdbmDatabase( suffix, suffix, workDir.getPath() );
- AttributeTypeRegistry attributeTypeRegistry = bootstrapRegistries .getAttributeTypeRegistry();
- OidRegistry oidRegistry = bootstrapRegistries.getOidRegistry();
- ExpressionEvaluator evaluator = new ExpressionEvaluator( db, oidRegistry, attributeTypeRegistry );
- ExpressionEnumerator enumerator = new ExpressionEnumerator( db, attributeTypeRegistry, evaluator );
- SearchEngine eng = new DefaultSearchEngine( db, evaluator, enumerator );
-
- AttributeType[] attributes = new AttributeType[]
- {
- attributeTypeRegistry.lookup( SystemPartition.ALIAS_OID ),
- attributeTypeRegistry.lookup( SystemPartition.EXISTANCE_OID ),
- attributeTypeRegistry.lookup( SystemPartition.HIERARCHY_OID ),
- attributeTypeRegistry.lookup( SystemPartition.NDN_OID ),
- attributeTypeRegistry.lookup( SystemPartition.ONEALIAS_OID ),
- attributeTypeRegistry.lookup( SystemPartition.SUBALIAS_OID ),
- attributeTypeRegistry.lookup( SystemPartition.UPDN_OID )
- };
-
- systemPartition = new SystemPartition( db, eng, attributes );
- globalRegistries = new GlobalRegistries( systemPartition, bootstrapRegistries );
- rootNexus = new RootNexus( systemPartition, new LockableAttributesImpl() );
-
- interceptorChain = new InterceptorChain( configuration.getInterceptorConfigurations() );
- interceptorChain.init( new InterceptorContext( configuration, systemPartition, globalRegistries, rootNexus ) );
-
- // fire up the app partitions now!
- startUpAppPartitions();
+ return parent.getJndiContext( baseName );
}
- /**
- * Starts up all the application partitions that will be attached to naming contexts in the system. Partition
- * database files are created within a subdirectory immediately under the Eve working directory base.
- *
- * @throws javax.naming.NamingException if there are problems creating and starting these new application
- * partitions
- */
- private void startUpAppPartitions() throws NamingException
+ public Context getJndiContext( String principal, byte[] credential, String authentication, String baseName ) throws NamingException
{
- OidRegistry oidRegistry = globalRegistries.getOidRegistry();
- AttributeTypeRegistry attributeTypeRegistry;
- attributeTypeRegistry = globalRegistries.getAttributeTypeRegistry();
- MatchingRuleRegistry reg = globalRegistries.getMatchingRuleRegistry();
-
- File workDir = configuration.getWorkingDirectory();
-
- Iterator i = configuration.getContextPartitionConfigurations().iterator();
- while( i.hasNext() )
- {
- ContextPartitionConfiguration cfg = ( ContextPartitionConfiguration ) i.next();
-
- // ----------------------------------------------------------------
- // create working directory under eve directory for app partition
- // ----------------------------------------------------------------
-
- File partitionWorkDir = new File( workDir.getPath() + File.separator + cfg.getName() );
- partitionWorkDir.mkdirs();
-
- // ----------------------------------------------------------------
- // create the database/store
- // ----------------------------------------------------------------
-
- Name upSuffix = new LdapName( cfg.getSuffix() );
- Normalizer dnNorm = reg.lookup( "distinguishedNameMatch" ) .getNormalizer();
- Name normSuffix = new LdapName( ( String ) dnNorm.normalize( cfg.getSuffix() ) );
- Database db = new JdbmDatabase( upSuffix, normSuffix, partitionWorkDir.getPath() );
-
- // ----------------------------------------------------------------
- // create the search engine using db, enumerators and evaluators
- // ----------------------------------------------------------------
-
- ExpressionEvaluator evaluator;
- evaluator = new ExpressionEvaluator( db, oidRegistry, attributeTypeRegistry );
- ExpressionEnumerator enumerator;
- enumerator = new ExpressionEnumerator( db, attributeTypeRegistry, evaluator );
- SearchEngine eng = new DefaultSearchEngine( db, evaluator, enumerator );
-
- // ----------------------------------------------------------------
- // fill up a list with the AttributeTypes for the system indices
- // ----------------------------------------------------------------
-
- ArrayList attributeTypeList = new ArrayList();
- attributeTypeList.add( attributeTypeRegistry.lookup( SystemPartition.ALIAS_OID ) );
- attributeTypeList.add( attributeTypeRegistry.lookup( SystemPartition.EXISTANCE_OID ) );
- attributeTypeList.add( attributeTypeRegistry.lookup( SystemPartition.HIERARCHY_OID ) );
- attributeTypeList.add( attributeTypeRegistry.lookup( SystemPartition.NDN_OID ) );
- attributeTypeList.add( attributeTypeRegistry.lookup( SystemPartition.ONEALIAS_OID ) );
- attributeTypeList.add( attributeTypeRegistry.lookup( SystemPartition.SUBALIAS_OID ) );
- attributeTypeList.add( attributeTypeRegistry.lookup( SystemPartition.UPDN_OID ) );
-
- // ----------------------------------------------------------------
- // if user indices are specified add those attribute types as well
- // ----------------------------------------------------------------
-
- Iterator j = cfg.getIndexedAttributes().iterator();
- while( j.hasNext() )
- {
- String attribute = ( String ) j.next();
- attributeTypeList.add( attributeTypeRegistry
- .lookup( attribute ) );
- }
-
- // ----------------------------------------------------------------
- // fire up the appPartition & register it with the nexus
- // ----------------------------------------------------------------
-
- AttributeType[] indexTypes = ( AttributeType[] ) attributeTypeList
- .toArray( new AttributeType[attributeTypeList.size()] );
-
- ContextPartition partition = cfg.getContextPartition();
-
- if ( partition == null )
- {
- // If custom partition is not defined, use the ApplicationPartion.
- partition = new ApplicationPartition( db, eng, indexTypes );
- }
-
- // Initialize the partition
- try
- {
- partition.init( upSuffix, normSuffix );
- rootNexus.register( partition );
- }
- catch ( Exception e )
- {
- throw ( NamingException ) new NamingException(
- "Failed to initialize custom partition." ).initCause( e );
- }
-
- // ----------------------------------------------------------------
- // add the nexus context entry
- // ----------------------------------------------------------------
-
- partition.add( cfg.getSuffix(), normSuffix, cfg.getContextEntry() );
- }
+ return parent.getJndiContext( principal, credential, authentication, baseName );
}
}