You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by er...@apache.org on 2005/11/28 20:52:52 UTC

svn commit: r349484 - in /directory/sandbox/ersiner/apacheds-with-storedprocs: core-unit/src/test/java/org/apache/ldap/server/storedprocs/JavaStoredProcTest.java core/src/main/java/org/apache/ldap/server/storedprocs/LdapClassLoader.java

Author: ersiner
Date: Mon Nov 28 11:52:39 2005
New Revision: 349484

URL: http://svn.apache.org/viewcvs?rev=349484&view=rev
Log:
LdapClassLoader now considers default search contexts.


Modified:
    directory/sandbox/ersiner/apacheds-with-storedprocs/core-unit/src/test/java/org/apache/ldap/server/storedprocs/JavaStoredProcTest.java
    directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/LdapClassLoader.java

Modified: directory/sandbox/ersiner/apacheds-with-storedprocs/core-unit/src/test/java/org/apache/ldap/server/storedprocs/JavaStoredProcTest.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/ersiner/apacheds-with-storedprocs/core-unit/src/test/java/org/apache/ldap/server/storedprocs/JavaStoredProcTest.java?rev=349484&r1=349483&r2=349484&view=diff
==============================================================================
--- directory/sandbox/ersiner/apacheds-with-storedprocs/core-unit/src/test/java/org/apache/ldap/server/storedprocs/JavaStoredProcTest.java (original)
+++ directory/sandbox/ersiner/apacheds-with-storedprocs/core-unit/src/test/java/org/apache/ldap/server/storedprocs/JavaStoredProcTest.java Mon Nov 28 11:52:39 2005
@@ -101,4 +101,38 @@
                 new Object[] { new String[] { } }
                 );
     }
+    
+    public void testStoredProcedureExecutionOverServerLdapContextEntryPointWithDefaultSearchContext() throws NamingException
+    {
+        ServerLdapContext defaultContext = ( ServerLdapContext ) sysRoot.lookup( "ou=system" );
+        ServerLdapContext RootDSE = ( ServerLdapContext ) sysRoot.lookup( "" );
+        
+        // set up
+        Attributes attributes = new BasicAttributes( "objectClass", "top", true );
+        attributes.get( "objectClass" ).add( "javaClass" );
+        attributes.put( "fqcn", "HelloWorld" );
+        attributes.put( "byteCode", HELLOWORLD_CLASS_BYTES );
+        defaultContext.createSubcontext( "fqcn=HelloWorld", attributes );
+        // assert set up successfull
+        assertNotNull( defaultContext.lookup( "fqcn=HelloWorld" ) );
+        
+        ServerLdapContext configurationContext = ( ServerLdapContext ) sysRoot.lookup( "ou=configuration,ou=system" );
+        
+        // set up
+        Attributes attributes2 = new BasicAttributes( "objectClass", "top", true );
+        attributes2.get( "objectClass" ).add( "extensibleObject" );
+        attributes2.put( "classLoaderDefaultSearchContext", "ou=system" );
+        attributes2.put( "cn", "ClassLoaderDefaultSearchContexts" );
+        configurationContext.createSubcontext( "cn=ClassLoaderDefaultSearchContexts", attributes2 );
+        // assert set up successfull
+        assertNotNull( configurationContext.lookup( "cn=ClassLoaderDefaultSearchContexts" ) );
+        
+        
+        // invoke the SP over current context
+        RootDSE.executeProcedure( 
+                "HelloWorld.main",
+                new Class[] { String[].class },
+                new Object[] { new String[] { } }
+                );
+    }
 }

Modified: directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/LdapClassLoader.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/LdapClassLoader.java?rev=349484&r1=349483&r2=349484&view=diff
==============================================================================
--- directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/LdapClassLoader.java (original)
+++ directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/LdapClassLoader.java Mon Nov 28 11:52:39 2005
@@ -43,62 +43,98 @@
 public class LdapClassLoader extends ClassLoader
 {
     private static final Logger log = LoggerFactory.getLogger( LdapClassLoader.class );
-    private ServerLdapContext ctx;
+    private static String defaultSearchContextsConfig="cn=ClassLoaderDefaultSearchContexts,ou=configuration,ou=system";
+    private ServerLdapContext RootDSE;
 
     
-    public LdapClassLoader( ServerLdapContext ctx )
+    public LdapClassLoader( ServerLdapContext RootDSE ) throws NamingException
     {
-        this.ctx = ctx;
+        this.RootDSE = ( ( ServerLdapContext ) RootDSE.lookup( "" ) );
     }
 
-    
-    public Class findClass( String name ) throws ClassNotFoundException
+    private byte[] findClassInDIT( NamingEnumeration searchContexts, String name ) throws ClassNotFoundException
     {
+        String currentSearchContextName = null;
+        ServerLdapContext currentSearchContext = null;
+        NamingEnumeration javaClassEntries = null;
         byte[] classBytes = null;
-
+        
         BranchNode filter = new BranchNode( BranchNode.AND );
         filter.addNode( new SimpleNode( "fqcn", name, LeafNode.EQUALITY ) );
         filter.addNode( new SimpleNode( "objectClass", "javaClass", LeafNode.EQUALITY ) );
+        
         SearchControls controls = new SearchControls();
         controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
+        
+        try
+        {
+            while( searchContexts.hasMore() )
+            {
+                currentSearchContextName = ( String ) searchContexts.next();
+                currentSearchContext = ( ServerLdapContext ) RootDSE.lookup( currentSearchContextName );
+                
+                javaClassEntries = currentSearchContext.search( new LdapName(), filter, controls );
+                if ( javaClassEntries.hasMore() ) // there should be only one!
+                {
+                    SearchResult javaClassEntry = ( SearchResult ) javaClassEntries.next();
+                    Attribute byteCode = javaClassEntry.getAttributes().get( "byteCode" );
+                    classBytes = ( byte[] ) byteCode.get();
+                    continue;
+                }
+            }
+        }
+        catch ( NamingException e )
+        {
+            throw new ClassNotFoundException();
+        }
+        
+        return classBytes;
+    }
+    
+    public Class findClass( String name ) throws ClassNotFoundException
+    {
+        byte[] classBytes = null;
 
-        NamingEnumeration list = null;
+        NamingEnumeration defaultSearchContexts = null;
+        NamingEnumeration namingContexts = null;
+        
+        ServerLdapContext defaultSearchContextsConfigContext = null;
         
         try 
         {   
-            ServerLdapContext RootDSE = ( ( ServerLdapContext ) ctx.lookup( "" ) );
-            
-            // get Naming Contexts over the RootDSE
-            NamingEnumeration namingContexts = RootDSE
-                .getAttributes( "", new String[] { "namingContexts" } )
-                .get( "namingContexts" ).getAll();
-            
-            String currentNamingContext = null;
-            boolean classFound = false;
+            try
+            {
+                defaultSearchContextsConfigContext = 
+                    ( ServerLdapContext ) RootDSE.lookup( defaultSearchContextsConfig );
+            }
+            catch ( NamingException e )
+            {
+                log.debug( "No configuration data found for class loader default search contexts." );
+            };
             
-            while( namingContexts.hasMore() )
+            if ( defaultSearchContextsConfigContext != null )
             {
-                currentNamingContext = ( String ) namingContexts.next();
+                defaultSearchContexts = defaultSearchContextsConfigContext
+                    .getAttributes( "", new String[] { "classLoaderDefaultSearchContext" } )
+                    .get( "classLoaderDefaultSearchContext" ).getAll();
                 
-                System.out.println( currentNamingContext );
-                
-                // search the class under the naming context considered 
-                list = ( ( ServerLdapContext ) RootDSE.lookup( currentNamingContext ) ).search( new LdapName(), filter, controls );
-                if ( list.hasMore() )
+                try
                 {
-                    SearchResult result = ( SearchResult ) list.next();
-                    Attribute byteCode = result.getAttributes().get( "byteCode" );
-                    classBytes = ( byte[] ) byteCode.get();
-                    classFound = true;
-                    continue;
+                    classBytes = findClassInDIT( defaultSearchContexts, name );
+                }
+                catch ( ClassNotFoundException e )
+                {
+                    log.debug( "Class " + name + " could not be found under default search contexts." );
                 }
             }
             
-            if ( !classFound )
+            if ( classBytes == null )
             {
-                String msg = "Class " + name + " not found in DIT.";
-                log.warn( msg );
-                throw new ClassNotFoundException( msg );
+                namingContexts = RootDSE
+                    .getAttributes( "", new String[] { "namingContexts" } )
+                    .get( "namingContexts" ).getAll();
+                
+                classBytes = findClassInDIT( namingContexts, name );
             }
         } 
         catch ( NamingException e ) 
@@ -107,9 +143,16 @@
             log.error( msg, e );
             throw new ClassNotFoundException( msg );
         }
+        catch ( ClassNotFoundException e )
+        {
+            String msg = "Class " + name + " not found in DIT.";
+            log.warn( msg );
+            throw new ClassNotFoundException( msg );
+        }
         finally
         {
-            if ( list != null ) { try { list.close(); } catch( Exception e ) {} };
+            if ( defaultSearchContexts != null ) { try { defaultSearchContexts.close(); } catch( Exception e ) {} };
+            if ( namingContexts != null ) { try { namingContexts.close(); } catch( Exception e ) {} };
         }
 
         return defineClass( name, classBytes, 0, classBytes.length );