You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2004/12/07 08:43:00 UTC

svn commit: r110095 - in incubator/directory/eve/trunk: eve/src/java/org/apache/eve jndi-provider/src/java/org/apache/eve jndi-provider/src/java/org/apache/eve/jndi jndi-provider/src/test/org/apache/eve/jndi xdocs

Author: akarasulu
Date: Mon Dec  6 23:42:59 2004
New Revision: 110095

URL: http://svn.apache.org/viewcvs?view=rev&rev=110095
Log:
Changes ...

 o refactored out some JNDI environment constants into new EnvKeys
 o created new configuration bean for ContextPartitions 
 o created builder which builds a ContextPartitionConfig from a Hashtable
 o added documentation on partitions and how to create user partitions


Added:
   incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/ContextPartitionConfig.java
   incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/jndi/EnvKeys.java
   incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/jndi/PartitionConfigBuilder.java
   incubator/directory/eve/trunk/xdocs/partitions.xml
Modified:
   incubator/directory/eve/trunk/eve/src/java/org/apache/eve/EveMain.java
   incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/jndi/EveContextFactory.java
   incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/AbstractJndiTest.java
   incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/EveContextFactoryTest.java
   incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/RootDSETest.java
   incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/ShutdownTest.java
   incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/SimpleAuthenticationTest.java
   incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/SyncTest.java

Modified: incubator/directory/eve/trunk/eve/src/java/org/apache/eve/EveMain.java
Url: http://svn.apache.org/viewcvs/incubator/directory/eve/trunk/eve/src/java/org/apache/eve/EveMain.java?view=diff&rev=110095&p1=incubator/directory/eve/trunk/eve/src/java/org/apache/eve/EveMain.java&r1=110094&p2=incubator/directory/eve/trunk/eve/src/java/org/apache/eve/EveMain.java&r2=110095
==============================================================================
--- incubator/directory/eve/trunk/eve/src/java/org/apache/eve/EveMain.java	(original)
+++ incubator/directory/eve/trunk/eve/src/java/org/apache/eve/EveMain.java	Mon Dec  6 23:42:59 2004
@@ -25,7 +25,7 @@
 import javax.naming.directory.InitialDirContext;
 
 import org.apache.ldap.common.util.PropertiesUtils;
-import org.apache.eve.jndi.EveContextFactory;
+import org.apache.eve.jndi.EnvKeys;
 import org.apache.seda.listener.AvailablePortFinder;
 
 
@@ -62,7 +62,7 @@
             env = new Properties();
         }
 
-        if ( ! env.containsKey( EveContextFactory.EVE_LDAP_PORT ) )
+        if ( ! env.containsKey( EnvKeys.EVE_LDAP_PORT ) )
         {
             int port = LDAP_PORT;
 
@@ -73,7 +73,7 @@
                         + " is not available, using " + port + " instead" );
             }
 
-            env.setProperty( EveContextFactory.EVE_LDAP_PORT, String.valueOf( port ) );
+            env.setProperty( EnvKeys.EVE_LDAP_PORT, String.valueOf( port ) );
         }
 
         env.setProperty( Context.PROVIDER_URL, "ou=system" );
@@ -101,7 +101,7 @@
 
                 try
                 {
-                    env.setProperty( EveContextFactory.SYNC_OP_ENV, "true" );
+                    env.setProperty( EnvKeys.SYNC, "true" );
                     new InitialDirContext( env );
                 }
                 catch ( NamingException e )

Added: incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/ContextPartitionConfig.java
Url: http://svn.apache.org/viewcvs/incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/ContextPartitionConfig.java?view=auto&rev=110095
==============================================================================
--- (empty file)
+++ incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/ContextPartitionConfig.java	Mon Dec  6 23:42:59 2004
@@ -0,0 +1,83 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed 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.eve;
+
+
+import javax.naming.directory.Attributes;
+
+
+/**
+ * A configuration bean for ContextPartitions.
+ *
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+public class ContextPartitionConfig
+{
+    private String suffix;
+    private String id;
+    private String[] indices;
+    private Attributes attributes;
+
+
+    public String getSuffix()
+    {
+        return suffix;
+    }
+
+
+    public void setSuffix( String suffix )
+    {
+        this.suffix = suffix;
+    }
+
+
+    public String getId()
+    {
+        return id;
+    }
+
+
+    public void setId( String id )
+    {
+        this.id = id;
+    }
+
+
+    public String[] getIndices()
+    {
+        return indices;
+    }
+
+
+    public void setIndices( String[] indices )
+    {
+        this.indices = indices;
+    }
+
+
+    public Attributes getAttributes()
+    {
+        return attributes;
+    }
+
+
+    public void setAttributes( Attributes attributes )
+    {
+        this.attributes = attributes;
+    }
+}

Added: incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/jndi/EnvKeys.java
Url: http://svn.apache.org/viewcvs/incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/jndi/EnvKeys.java?view=auto&rev=110095
==============================================================================
--- (empty file)
+++ incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/jndi/EnvKeys.java	Mon Dec  6 23:42:59 2004
@@ -0,0 +1,67 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed 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.eve.jndi;
+
+
+/**
+ * JNDI environment property key constants.
+ *
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+public class EnvKeys
+{
+    // ------------------------------------------------------------------------
+    // Properties for operations
+    // ------------------------------------------------------------------------
+
+    /** property used to shutdown the system */
+    public static final String SHUTDOWN = "eve.operation.shutdown";
+    /** property used to sync the system with disk */
+    public static final String SYNC = "eve.operation.sync";
+
+
+    // ------------------------------------------------------------------------
+    // Properties for
+    // ------------------------------------------------------------------------
+
+    /** bootstrap prop: path to eve's working directory - relative or absolute */
+    public static final String WKDIR = "eve.wkdir";
+    /** a comma separated list of schema class files to load */
+    public static final String SCHEMAS = "eve.schemas";
+    /** bootstrap prop: if key is present it enables anonymous users */
+    public static final String DISABLE_ANONYMOUS = "eve.disable.anonymous";
+
+
+    /** key used to disable the networking layer (wire protocol) */
+    public static final String DISABLE_PROTOCOL = "eve.net.disable.protocol";
+    public static final String EVE_LDAP_PORT = "eve.net.ldap.port";
+    public static final String EVE_LDAPS_PORT = "eve.net.ldaps.port";
+
+    // ------------------------------------------------------------------------
+    // Properties for partition configuration
+    // ------------------------------------------------------------------------
+
+    /** a comma separated list of partition names */
+    public static final String PARTITIONS = "eve.db.partitions";
+    /** the envprop key base to the suffix of a partition */
+    public static final String SUFFIX = "eve.db.partition.suffix.";
+    /** the envprop key base to the space separated list of indices for a partition */
+    public static final String INDICES = "eve.db.partition.indices.";
+    /** the envprop key base to the Attributes for the context nexus entry */
+    public static final String ATTRIBUTES = "eve.db.partition.attributes.";
+}

Modified: incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/jndi/EveContextFactory.java
Url: http://svn.apache.org/viewcvs/incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/jndi/EveContextFactory.java?view=diff&rev=110095&p1=incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/jndi/EveContextFactory.java&r1=110094&p2=incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/jndi/EveContextFactory.java&r2=110095
==============================================================================
--- incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/jndi/EveContextFactory.java	(original)
+++ incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/jndi/EveContextFactory.java	Mon Dec  6 23:42:59 2004
@@ -83,6 +83,8 @@
 {
     /** the default LDAP port to use */
     private static final int LDAP_PORT = 389;
+    /** default path to working directory if WKDIR_ENV property is not set */
+    public static final String DEFAULT_WKDIR = "eve";
 
     // for convenience
     private static final String TYPE = Context.SECURITY_AUTHENTICATION;
@@ -91,43 +93,6 @@
     private static final String ADMIN = SystemPartition.ADMIN_PRINCIPAL;
     private static final Name ADMIN_NAME = SystemPartition.getAdminDn();
 
-    // ------------------------------------------------------------------------
-    // Custom JNDI properties
-    // ------------------------------------------------------------------------
-
-    /** property used to shutdown the system */
-    public static final String SHUTDOWN_OP_ENV = "eve.operation.shutdown";
-    /** property used to sync the system with disk */
-    public static final String SYNC_OP_ENV = "eve.operation.sync";
-    /** key base for a set of user indices provided as comma sep list of attribute names or oids */
-    public static final String USER_INDICES_ENV_BASE = "eve.user.db.indices";
-    /** bootstrap prop: path to eve's working directory - relative or absolute */
-    public static final String WKDIR_ENV = "eve.wkdir";
-    /** default path to working directory if WKDIR_ENV property is not set */
-    public static final String DEFAULT_WKDIR = "eve";
-    /** a comma separated list of schema class files to load */
-    public static final String SCHEMAS_ENV = "eve.schemas";
-    /** bootstrap prop: if key is present it enables anonymous users */
-    public static final String DISABLE_ANONYMOUS_ENV = "eve.disable.anonymous";
-
-
-    /** key used to disable the networking layer (wire protocol) */
-    public static final String DISABLE_PROTOCOL = "eve.net.disable.protocol";
-    public static final String EVE_LDAP_PORT = "eve.net.ldap.port";
-    public static final String EVE_LDAPS_PORT = "eve.net.ldaps.port";
-
-    // ------------------------------------------------------------------------
-    // Custom JNDI properties for adding new application partitions
-    // ------------------------------------------------------------------------
-
-    /** a comma separated list of partition names */
-    public static final String PARTITIONS_ENV = "eve.db.partitions";
-    /** the envprop key base to the suffix of a partition */
-    public static final String SUFFIX_BASE_ENV = "eve.db.partition.suffix.";
-    /** the envprop key base to the space separated list of indices for a partition */
-    public static final String INDICES_BASE_ENV = "eve.db.partition.indices.";
-    /** the envprop key base to the Attributes for the context nexus entry */
-    public static final String ATTRIBUTES_BASE_ENV = "eve.db.partition.attributes.";
     /** default schema classes for the SCHEMAS_ENV property if not set */
     private static final String[] DEFAULT_SCHEMAS = new String[]
     {
@@ -194,7 +159,7 @@
         env = ( Hashtable ) env.clone();
         Context ctx = null;
 
-        if ( env.containsKey( SHUTDOWN_OP_ENV ) )
+        if ( env.containsKey( EnvKeys.SHUTDOWN ) )
         {
             if ( this.provider == null )
             {
@@ -225,7 +190,7 @@
             return ctx;
         }
 
-        if ( env.containsKey( SYNC_OP_ENV ) )
+        if ( env.containsKey( EnvKeys.SYNC ) )
         {
             provider.sync();
             return provider.getLdapContext( env );
@@ -243,11 +208,11 @@
         {
             // we need to check this here instead of in AuthenticationService
             // because otherwise we are going to start up the system incorrectly
-            if ( isAnonymous( env ) && env.containsKey( DISABLE_ANONYMOUS_ENV ) )
+            if ( isAnonymous( env ) && env.containsKey( EnvKeys.DISABLE_ANONYMOUS ) )
             {
                 throw new LdapNoPermissionException( "cannot bind as anonymous "
                     + "on startup while disabling anonymous binds w/ property: "
-                    + DISABLE_ANONYMOUS_ENV );
+                    + EnvKeys.DISABLE_ANONYMOUS );
             }
 
             this.initialEnv = env;
@@ -261,7 +226,7 @@
             }
 
             // fire up the front end if we have not explicitly disabled it
-            if ( ! initialEnv.containsKey( DISABLE_PROTOCOL ) )
+            if ( ! initialEnv.containsKey( EnvKeys.DISABLE_PROTOCOL ) )
             {
                 startUpWireProtocol();
             }
@@ -419,9 +384,9 @@
         BootstrapSchemaLoader loader = new BootstrapSchemaLoader();
 
         String[] schemas = DEFAULT_SCHEMAS;
-        if ( initialEnv.containsKey( SCHEMAS_ENV ) )
+        if ( initialEnv.containsKey( EnvKeys.SCHEMAS ) )
         {
-            schemas = ( ( String ) initialEnv.get( SCHEMAS_ENV ) ).split( "," );
+            schemas = ( ( String ) initialEnv.get( EnvKeys.SCHEMAS ) ).split( "," );
             for ( int ii = 0; ii < schemas.length; ii++ )
             {
                 schemas[ii] = schemas[ii].trim();
@@ -443,9 +408,9 @@
 
 
         String wkdir = DEFAULT_WKDIR;
-        if ( initialEnv.containsKey( WKDIR_ENV ) )
+        if ( initialEnv.containsKey( EnvKeys.WKDIR ) )
         {
-            wkdir = ( ( String ) initialEnv.get( WKDIR_ENV ) ).trim();
+            wkdir = ( ( String ) initialEnv.get( EnvKeys.WKDIR ) ).trim();
         }
 
         File wkdirFile = new File( wkdir );
@@ -507,7 +472,7 @@
         InvocationStateEnum[] state = new InvocationStateEnum[]{
             InvocationStateEnum.PREINVOCATION
         };
-        boolean allowAnonymous = ! initialEnv.containsKey( DISABLE_ANONYMOUS_ENV );
+        boolean allowAnonymous = ! initialEnv.containsKey( EnvKeys.DISABLE_ANONYMOUS );
         Interceptor interceptor = new AuthenticationService( nexus, allowAnonymous );
         provider.addInterceptor( interceptor, state );
 
@@ -561,7 +526,7 @@
         provider.addInterceptor( interceptor, state );
 
         // fire up the app partitions now!
-        if ( initialEnv.get( PARTITIONS_ENV ) != null )
+        if ( initialEnv.get( EnvKeys.PARTITIONS ) != null )
         {
             startUpAppPartitions( wkdir );
         }
@@ -585,7 +550,7 @@
 
         proto = new LdapProtocolProvider( ( Hashtable) initialEnv.clone(), fe.getEventRouter() );
 
-        int port = PropertiesUtils.get( initialEnv, EVE_LDAP_PORT, LDAP_PORT );
+        int port = PropertiesUtils.get( initialEnv, EnvKeys.EVE_LDAP_PORT, LDAP_PORT );
         srvEntry = new InetServiceEntry( proto.getName(), port, proto, TransportTypeEnum.TCP );
         ( ( DefaultInetServicesDatabase ) fe.getInetServicesDatabase()).addEntry( srvEntry );
 
@@ -632,7 +597,7 @@
         MatchingRuleRegistry reg = globalRegistries.getMatchingRuleRegistry();
 
         // start getting all the parameters from the initial environment
-        String[] names = ( ( String ) initialEnv.get( PARTITIONS_ENV ) ).split( " " );
+        String[] names = ( ( String ) initialEnv.get( EnvKeys.PARTITIONS ) ).split( " " );
 
         for ( int ii = 0; ii < names.length; ii++ )
         {
@@ -640,7 +605,7 @@
             // create working directory under eve directory for app partition
             // ----------------------------------------------------------------
 
-            String suffix = ( String ) initialEnv.get( SUFFIX_BASE_ENV + names[ii] );
+            String suffix = ( String ) initialEnv.get( EnvKeys.SUFFIX + names[ii] );
             String wkdir = eveWkdir + File.separator + names[ii];
             mkdirs( eveWkdir, names[ii] );
 
@@ -680,9 +645,9 @@
             // if user indices are specified add those attribute types as well
             // ----------------------------------------------------------------
 
-            if ( initialEnv.containsKey( INDICES_BASE_ENV + names[ii] ) )
+            if ( initialEnv.containsKey( EnvKeys.INDICES + names[ii] ) )
             {
-                String[] indices = ( ( String ) initialEnv.get( INDICES_BASE_ENV
+                String[] indices = ( ( String ) initialEnv.get( EnvKeys.INDICES
                         + names[ii] ) ).split( " " );
 
                 for ( int jj = 0; jj < indices.length; jj++ )
@@ -706,7 +671,7 @@
             // ----------------------------------------------------------------
 
             Attributes rootAttrs;
-            Object rootEntry = initialEnv.get( ATTRIBUTES_BASE_ENV + names[ii] );
+            Object rootEntry = initialEnv.get( EnvKeys.ATTRIBUTES + names[ii] );
 
             if ( rootEntry instanceof String )
             {

Added: incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/jndi/PartitionConfigBuilder.java
Url: http://svn.apache.org/viewcvs/incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/jndi/PartitionConfigBuilder.java?view=auto&rev=110095
==============================================================================
--- (empty file)
+++ incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/jndi/PartitionConfigBuilder.java	Mon Dec  6 23:42:59 2004
@@ -0,0 +1,103 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed 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.eve.jndi;
+
+
+import java.util.Hashtable;
+import java.util.Enumeration;
+
+import org.apache.eve.ContextPartitionConfig;
+import org.apache.ldap.common.message.LockableAttributesImpl;
+import org.apache.ldap.common.message.LockableAttributeImpl;
+
+
+/**
+ * A partition configuration builder which produces ContextPartitionConfig
+ * objects from various configuration formats, namely Hashtables.
+ *
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+public class PartitionConfigBuilder
+{
+    /**
+     * Extracts properties from a Hashtable and builds a configuration bean for
+     * a ContextPartition.
+     *
+     * @param id the id of the partition to extract configs for
+     * @param env the Hastable containing usually JNDI environment settings
+     * @return the extracted configuration object
+     */
+    public static ContextPartitionConfig getContextPartitionConfig( String id, Hashtable env )
+    {
+        StringBuffer buf = new StringBuffer();
+        ContextPartitionConfig config = new ContextPartitionConfig();
+        LockableAttributesImpl attrs = new LockableAttributesImpl();
+
+        config.setId( id );
+
+        buf.append( EnvKeys.SUFFIX ).append( id );
+        config.setSuffix( ( String ) env.get(  buf.toString() ) );
+
+        buf.setLength( 0 );
+        buf.append( EnvKeys.INDICES ).append( id );
+        config.setIndices( ( ( String ) env.get( buf.toString() ) ).split( " " ) );
+
+        buf.setLength( 0 );
+        buf.append( EnvKeys.ATTRIBUTES ).append( id ).append( "." );
+
+        String keyBase = buf.toString();
+        for ( Enumeration list = env.keys(); list.hasMoreElements(); )
+        {
+            String attrKey = ( String ) list.nextElement();
+
+            if ( attrKey.startsWith( keyBase ) )
+            {
+                LockableAttributeImpl attr = new LockableAttributeImpl( attrs,
+                        attrKey.substring( attrKey.length() ) ) ;
+                String[] values = ( String[] ) env.get( attrKey );
+                for ( int ii = 0; ii < values.length; ii++ )
+                {
+                    attr.add( values[ii] );
+                }
+            }
+        }
+
+        return config;
+    }
+
+
+    /**
+     * Extracts properties from a Hashtable and builds a set of configurations
+     * bean for ContextPartitions.
+     *
+     * @param env the Hastable containing usually JNDI environment settings
+     * @return all the extracted configuration objects configured
+     */
+    public static ContextPartitionConfig[] getContextPartitionConfigs( Hashtable env )
+    {
+        final String[] ids = ( String[] ) env.get( EnvKeys.PARTITIONS );
+        final ContextPartitionConfig[] configs = new ContextPartitionConfig[ids.length];
+
+        for ( int ii = 0; ii < configs.length; ii++ )
+        {
+            configs[ii] = getContextPartitionConfig( ids[ii], env );
+        }
+
+        return configs;
+    }
+}

Modified: incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/AbstractJndiTest.java
Url: http://svn.apache.org/viewcvs/incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/AbstractJndiTest.java?view=diff&rev=110095&p1=incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/AbstractJndiTest.java&r1=110094&p2=incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/AbstractJndiTest.java&r2=110095
==============================================================================
--- incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/AbstractJndiTest.java	(original)
+++ incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/AbstractJndiTest.java	Mon Dec  6 23:42:59 2004
@@ -63,7 +63,7 @@
         super.setUp();
         doDelete( new File( "target" + File.separator + "eve" ) );
 
-        extras.put( EveContextFactory.EVE_LDAP_PORT,
+        extras.put( EnvKeys.EVE_LDAP_PORT,
                 String.valueOf( AvailablePortFinder.getNextAvailable( 1024 ) ) );
 
         setSysRoot( "uid=admin,ou=system", "secret" );
@@ -126,7 +126,7 @@
         envFinal.putAll( extras );
         envFinal.putAll( env );
         envFinal.put( Context.PROVIDER_URL, "ou=system" );
-        envFinal.put( EveContextFactory.WKDIR_ENV, "target" + File.separator + "eve" );
+        envFinal.put( EnvKeys.WKDIR, "target" + File.separator + "eve" );
         envFinal.put( Context.INITIAL_CONTEXT_FACTORY, "org.apache.eve.jndi.EveContextFactory" );
         envFinal.putAll( overrides );
         return sysRoot = new InitialLdapContext( envFinal, null );
@@ -144,7 +144,7 @@
         Hashtable env = new Hashtable();
         env.put( Context.PROVIDER_URL, "ou=system" );
         env.put( Context.INITIAL_CONTEXT_FACTORY, "org.apache.eve.jndi.EveContextFactory" );
-        env.put( EveContextFactory.SHUTDOWN_OP_ENV, "" );
+        env.put( EnvKeys.SHUTDOWN, "" );
         env.put( Context.SECURITY_PRINCIPAL, "uid=admin,ou=system" );
         env.put( Context.SECURITY_CREDENTIALS, "secret" );
         try { new InitialContext( env ); } catch( Exception e ) {}

Modified: incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/EveContextFactoryTest.java
Url: http://svn.apache.org/viewcvs/incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/EveContextFactoryTest.java?view=diff&rev=110095&p1=incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/EveContextFactoryTest.java&r1=110094&p2=incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/EveContextFactoryTest.java&r2=110095
==============================================================================
--- incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/EveContextFactoryTest.java	(original)
+++ incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/EveContextFactoryTest.java	Mon Dec  6 23:42:59 2004
@@ -45,10 +45,10 @@
         attr.add( "testing" );
         attrs.put( attr );
 
-        extras.put( EveContextFactory.PARTITIONS_ENV, "testing example" );
-        extras.put( EveContextFactory.SUFFIX_BASE_ENV + "testing", "ou=testing" );
-        extras.put( EveContextFactory.INDICES_BASE_ENV + "testing", "ou objectClass" );
-        extras.put( EveContextFactory.ATTRIBUTES_BASE_ENV + "testing", attrs );
+        extras.put( EnvKeys.PARTITIONS, "testing example" );
+        extras.put( EnvKeys.SUFFIX + "testing", "ou=testing" );
+        extras.put( EnvKeys.INDICES + "testing", "ou objectClass" );
+        extras.put( EnvKeys.ATTRIBUTES + "testing", attrs );
 
         attrs = new BasicAttributes( true );
         attr = new BasicAttribute( "objectClass" );
@@ -60,9 +60,9 @@
         attr.add( "example" );
         attrs.put( attr );
 
-        extras.put( EveContextFactory.SUFFIX_BASE_ENV + "example", "dc=example" );
-        extras.put( EveContextFactory.INDICES_BASE_ENV + "example", "ou dc objectClass" );
-        extras.put( EveContextFactory.ATTRIBUTES_BASE_ENV + "example", attrs );
+        extras.put( EnvKeys.SUFFIX + "example", "dc=example" );
+        extras.put( EnvKeys.INDICES + "example", "ou dc objectClass" );
+        extras.put( EnvKeys.ATTRIBUTES + "example", attrs );
     }
 
 

Modified: incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/RootDSETest.java
Url: http://svn.apache.org/viewcvs/incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/RootDSETest.java?view=diff&rev=110095&p1=incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/RootDSETest.java&r1=110094&p2=incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/RootDSETest.java&r2=110095
==============================================================================
--- incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/RootDSETest.java	(original)
+++ incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/RootDSETest.java	Mon Dec  6 23:42:59 2004
@@ -86,7 +86,7 @@
         Hashtable env = new Hashtable();
         env.put( Context.PROVIDER_URL, "ou=system" );
         env.put( Context.INITIAL_CONTEXT_FACTORY, "org.apache.eve.jndi.EveContextFactory" );
-        env.put( EveContextFactory.SHUTDOWN_OP_ENV, "" );
+        env.put( EnvKeys.SHUTDOWN, "" );
         env.put( Context.SECURITY_PRINCIPAL, "uid=admin,ou=system" );
         env.put( Context.SECURITY_CREDENTIALS, "secret" );
         try { new InitialContext( env ); } catch( Exception e ) {}
@@ -102,7 +102,7 @@
     public void testGetInitialContext() throws NamingException
     {
         Hashtable env = new Hashtable();
-        env.put( EveContextFactory.WKDIR_ENV, "target/eve" );
+        env.put( EnvKeys.WKDIR, "target/eve" );
         env.put( Context.PROVIDER_URL, "" );
         env.put( Context.SECURITY_PRINCIPAL, "uid=admin,ou=system" );
         env.put( Context.SECURITY_CREDENTIALS, "secret" );
@@ -121,7 +121,7 @@
     public void testGetInitialContextLookupAttributes() throws NamingException
     {
         Hashtable env = new Hashtable();
-        env.put( EveContextFactory.WKDIR_ENV, "target/eve" );
+        env.put( EnvKeys.WKDIR, "target/eve" );
         env.put( Context.PROVIDER_URL, "" );
         env.put( Context.SECURITY_PRINCIPAL, "uid=admin,ou=system" );
         env.put( Context.SECURITY_CREDENTIALS, "secret" );
@@ -143,7 +143,7 @@
     public void testGetInitialContextLookupAttributesByName() throws NamingException
     {
         Hashtable env = new Hashtable();
-        env.put( EveContextFactory.WKDIR_ENV, "target/eve" );
+        env.put( EnvKeys.WKDIR, "target/eve" );
         env.put( Context.PROVIDER_URL, "" );
         env.put( Context.SECURITY_PRINCIPAL, "uid=admin,ou=system" );
         env.put( Context.SECURITY_CREDENTIALS, "secret" );
@@ -168,7 +168,7 @@
     public void testDelete() throws NamingException
     {
         Hashtable env = new Hashtable();
-        env.put( EveContextFactory.WKDIR_ENV, "target/eve" );
+        env.put( EnvKeys.WKDIR, "target/eve" );
         env.put( Context.PROVIDER_URL, "" );
         env.put( Context.SECURITY_PRINCIPAL, "uid=admin,ou=system" );
         env.put( Context.SECURITY_CREDENTIALS, "secret" );
@@ -202,7 +202,7 @@
     public void testRename() throws NamingException
     {
         Hashtable env = new Hashtable();
-        env.put( EveContextFactory.WKDIR_ENV, "target/eve" );
+        env.put( EnvKeys.WKDIR, "target/eve" );
         env.put( Context.PROVIDER_URL, "" );
         env.put( Context.SECURITY_PRINCIPAL, "uid=admin,ou=system" );
         env.put( Context.SECURITY_CREDENTIALS, "secret" );
@@ -236,7 +236,7 @@
     public void testModify() throws NamingException
     {
         Hashtable env = new Hashtable();
-        env.put( EveContextFactory.WKDIR_ENV, "target/eve" );
+        env.put( EnvKeys.WKDIR, "target/eve" );
         env.put( Context.PROVIDER_URL, "" );
         env.put( Context.SECURITY_PRINCIPAL, "uid=admin,ou=system" );
         env.put( Context.SECURITY_CREDENTIALS, "secret" );
@@ -272,7 +272,7 @@
     public void testModify2() throws NamingException
     {
         Hashtable env = new Hashtable();
-        env.put( EveContextFactory.WKDIR_ENV, "target/eve" );
+        env.put( EnvKeys.WKDIR, "target/eve" );
         env.put( Context.PROVIDER_URL, "" );
         env.put( Context.SECURITY_PRINCIPAL, "uid=admin,ou=system" );
         env.put( Context.SECURITY_CREDENTIALS, "secret" );

Modified: incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/ShutdownTest.java
Url: http://svn.apache.org/viewcvs/incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/ShutdownTest.java?view=diff&rev=110095&p1=incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/ShutdownTest.java&r1=110094&p2=incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/ShutdownTest.java&r2=110095
==============================================================================
--- incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/ShutdownTest.java	(original)
+++ incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/ShutdownTest.java	Mon Dec  6 23:42:59 2004
@@ -40,7 +40,7 @@
      */
     public void testShutdownNonNullContext() throws Exception
     {
-        overrides.put( EveContextFactory.SHUTDOWN_OP_ENV, "true" );
+        overrides.put( EnvKeys.SHUTDOWN, "true" );
 
         try
         {
@@ -48,7 +48,7 @@
         }
         finally
         {
-            overrides.remove( EveContextFactory.SHUTDOWN_OP_ENV );
+            overrides.remove( EnvKeys.SHUTDOWN );
         }
 
         assertNotNull( sysRoot );
@@ -62,7 +62,7 @@
      */
     public void testShutdownRestart() throws Exception
     {
-        overrides.put( EveContextFactory.SHUTDOWN_OP_ENV, "true" );
+        overrides.put( EnvKeys.SHUTDOWN, "true" );
 
         try
         {
@@ -70,7 +70,7 @@
         }
         finally
         {
-            overrides.remove( EveContextFactory.SHUTDOWN_OP_ENV );
+            overrides.remove( EnvKeys.SHUTDOWN );
         }
 
         assertNotNull( sysRoot );

Modified: incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/SimpleAuthenticationTest.java
Url: http://svn.apache.org/viewcvs/incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/SimpleAuthenticationTest.java?view=diff&rev=110095&p1=incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/SimpleAuthenticationTest.java&r1=110094&p2=incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/SimpleAuthenticationTest.java&r2=110095
==============================================================================
--- incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/SimpleAuthenticationTest.java	(original)
+++ incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/SimpleAuthenticationTest.java	Mon Dec  6 23:42:59 2004
@@ -178,7 +178,7 @@
         doDelete( new File( "target" + File.separator + "eve" ) );
         Hashtable env = new Hashtable();
         env.put( Context.SECURITY_AUTHENTICATION, "none" );
-        env.put( EveContextFactory.DISABLE_ANONYMOUS_ENV, "true" );
+        env.put( EnvKeys.DISABLE_ANONYMOUS, "true" );
 
         try
         {

Modified: incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/SyncTest.java
Url: http://svn.apache.org/viewcvs/incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/SyncTest.java?view=diff&rev=110095&p1=incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/SyncTest.java&r1=110094&p2=incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/SyncTest.java&r2=110095
==============================================================================
--- incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/SyncTest.java	(original)
+++ incubator/directory/eve/trunk/jndi-provider/src/test/org/apache/eve/jndi/SyncTest.java	Mon Dec  6 23:42:59 2004
@@ -36,7 +36,7 @@
      */
     public void testSyncNoException() throws Exception
     {
-        overrides.put( EveContextFactory.SYNC_OP_ENV, "true" );
+        overrides.put( EnvKeys.SYNC, "true" );
         sysRoot = setSysRoot( "uid=admin,ou=system", "secret" );
         assertNotNull( sysRoot );
     }
@@ -50,7 +50,7 @@
      */
     public void testPostSyncLookup() throws Exception
     {
-        overrides.put( EveContextFactory.SYNC_OP_ENV, "true" );
+        overrides.put( EnvKeys.SYNC, "true" );
         sysRoot = setSysRoot( "uid=admin,ou=system", "secret" );
         Attributes users = sysRoot.getAttributes( "ou=users" );
 

Added: incubator/directory/eve/trunk/xdocs/partitions.xml
Url: http://svn.apache.org/viewcvs/incubator/directory/eve/trunk/xdocs/partitions.xml?view=auto&rev=110095
==============================================================================
--- (empty file)
+++ incubator/directory/eve/trunk/xdocs/partitions.xml	Mon Dec  6 23:42:59 2004
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document>
+  <properties>
+    <author email="akarasulu@apache.org">Alex Karasulu</author>
+    <title>Partitions</title>
+  </properties>
+  
+  <body>
+    <section name="Partitions">
+      <p>
+        Partitions are entry stores assigned to a naming context.  The idea
+        behind a partition is that it stores a subset of the Directory
+        Information Base (DIB).  Partitions can be implemented in any way so
+        long as they adhere to interfaces.
+      </p>
+
+      <subsection name="Status">
+        <p>
+          Presently Eve has a single partition implementation which is used for
+          both the system partition and user partitions.  It uses
+          <a href="http://jdbm.sourceforge.net/">JDBM</a> as the underlying
+          B+Tree implementation for storing entries.
+        </p>
+
+        <p>
+          Other implementations are possible.  I'm particularly interested in
+          memory based partitions either BTree based or based on something like
+          Prevayer.
+        </p>
+
+        <p>
+          Partitions have simple interfaces that can be used to align any data
+          source to the LDAP data model thereby accessing it via JNDI or via
+          LDAP over the wire.  This makes Eve very flexible as a bridge to
+          standardize access to disparate data sources and formats.  Dynamic
+          mapping based backends are also interesting.
+        </p>
+      </subsection>
+
+      <subsection name="System Partition">
+        <p>
+          The system partition is a very special partition that is hardcoded to
+          hang off of the <b>ou=system</b> naming context.  It is always present
+          and contains administrative and operational information needed by the
+          server to operate.  Hence its name.
+        </p>
+
+        <p>
+          Eve's subsystems will use this partition to store information critical
+          to their operation.  Things like triggers, stored procedures, access
+          control instructions and schema information can be maintained here.
+        </p>
+      </subsection>
+
+      <subsection name="Root Nexus">
+        <p>
+          Several partitions can be assigned to different naming contexts within
+          Eve so long as their names do not overlap such that one partition's
+          naming context is contained within anothers.  The root nexus is a fake
+          partition that does not really store entries.  It maps other entry
+          storing partitions to naming contexts and routes backing store calls
+          to the partition containing the entry associated with the operation.
+        </p>
+      </subsection>
+
+      <subsection name="User/Application Partitions">
+        <p>
+          User partitions are partitions added by users.  When you download and
+          start using Eve you may want to create a separate partition to store
+          the entries of your application.  To us user and application partition
+          means the same thing: not the system partition!
+        </p>
+
+        <p>
+          Adding new application partitions to the server is a matter of
+          setting the right JNDI environment properties.  These properties are
+          used in both standalone and in embedded configurations.  Below is an
+          example of a properties configuration for two partitions hanging off
+          of the naming contexts <code>dc=apache,dc=org</code> and
+          <code>ou=test</code>:
+        </p>
+
+        <source>
+# all multivalued properties are space separated like the list of partions here
+eve.db.partitions=apache test
+
+# apache partition configuration
+eve.db.partition.suffix.apache=dc=apache,dc=org
+eve.db.partition.indices.apache=ou cn objectClass uid
+eve.db.partition.attributes.apache.dc=apache
+eve.db.partition.attributes.apache.objectClass=top domain extensibleObject
+
+# test partition configuration
+eve.db.partition.suffix.test=ou=test
+eve.db.partition.indices.test=ou objectClass
+eve.db.partition.attributes.test.ou=test
+eve.db.partition.attributes.test.objectClass=top organizationalUnit extensibleObject
+        </source>
+
+        <p>
+          Although somewhat ugly the way we use properties for settings does
+          work and hopefully we can build a tool on top of this to save the
+          user some hassle.  Another approach may be to use XML or something
+          easier to generate these properties from them.  For now its the best
+          non-specific means we have to inject settings through JNDI env
+          Hashtables while still being able to load settings via properties
+          files.  Ultimately JNDI properties are the common denominator.
+        </p>
+
+        <p>
+          Breifly we'll explain these properties.  All partition properties
+          are associated with one another using some partition id.  All
+          partition ids are listed as a space separated list using the <b>
+          eve.db.partitions</b> property: above it lists the ids for the too
+          partitions, <i>apache</i> and <i>test</i>.
+        </p>
+
+        <p>
+          Partitions need to know the naming context they will store entries
+          for.  This naming context is also referred to as the suffix since all
+          entries in the partition have this common suffix.  You guessed it,
+          the suffix is a distinguished name.  The property key for the suffix
+          of a partition is composed of the following property key base
+          <b>eve.db.partition.suffix.</b> concatenated with the id of the
+          partition: <b>eve.db.partition.suffix.</b><i>${id}</i>.  For example
+          if the partition id is foo, then the suffix key would be,
+          <b>eve.db.partition.suffix.foo</b>.
+         </p>
+
+        <p>
+          Partitions can have indices on attributes.  Unlike OpenLDAP where you
+          can build specific types of indices, Eve indices are of a single type.
+          For each partition a key is assembled from the partition id and the
+          property key base: <b>eve.db.partition.indices.</b><i>${id}</i>.  So
+          again for foo the key for attribute indices would be
+          <b>eve.db.partition.indices.foo</b>.  This value is a space separated
+          list of attributeType names to index.  For example the apache
+          partition has indices built on top of <b>ou</b>, <b>objectClass</b>
+          and <b>uid</b>.
+        </p>
+
+        <p>
+          When creating a context the root entry of the context corresponding
+          to the suffix of the partition must be created.  This entry is
+          composed of single-valued and multi-valued attributes.  We must
+          specify these attributes as well as their values.  To do so we again
+          use a key composed of a base, however this time we use both the id
+          of the partition and the name of the attribute:
+          <b>eve.db.partition.attributes.</b><i>${id}</i>.<i>${name}</i>.  So
+          for partition foo and attribute bar the following key would be used:
+          <b>eve.db.partition.attributes.foo.bar</b>.    The value of the key
+          is a space separated list of values for the bar attribute.  For
+          example the apache partition's suffix has an objectClass attribute
+          and its values are set to: top domain extensibleObject.
+        </p>
+      </subsection>
+
+      <subsection name="Future Progress">
+        <p>
+          Today we have some limitations to the way we can partition the DIB.
+          Namely we can't have a partition within a partition and sometimes this
+          makes sense.  Eventually we intend to enable this kind of
+          functionality using a special type of nexus which is both a router
+          and a backing store for entries.  It's smart enough to know what to
+          route verses when to use its own database.  Here's a <a href=
+          "http://nagoya.apache.org/jira/browse/DIREVE-23">JIRA improvement</a>
+          specifically aimed at achieving this goal.
+        </p>
+
+        <p>
+          Obviously we want as many different kinds of partitions as possible.
+          Ones using RDBMS' and ones using LDAP servers are welcome as well
+          so we can serve their content as well in one unified view.
+        </p>
+
+        <p>
+          Other aspirations include entry partitioning within a container
+          context.  Imagine having 250 million entries under
+          <code>ou=citizens,dc=census,dc=gov</code>.  You don't want all 250
+          million in one partition but would like to sub partition these entries
+          under the same context based on some attribute.  Basically we will be
+          using the attribute value to implement sub partitioning where within
+          a single context we are partitioning entries.
+        </p>
+      </subsection>
+
+    </section>
+  </body>
+</document>