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/27 22:32:41 UTC
svn commit: r349319 - in
/directory/sandbox/ersiner/apacheds-with-storedprocs:
core-unit/src/test/java/org/apache/ldap/server/storedprocs/
core/src/main/java/org/apache/ldap/server/storedprocs/
Author: ersiner
Date: Sun Nov 27 13:32:27 2005
New Revision: 349319
URL: http://svn.apache.org/viewcvs?rev=349319&view=rev
Log:
Modified the class loader to accept a RootDSE and to search all naming contexts.
Modified tests to use the new class loader.
Added a test to test SP execution over current ServerLdapContext.
Cleaned up code.
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-unit/src/test/java/org/apache/ldap/server/storedprocs/LdapClassLoaderTest.java
directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/JavaStoredProcedure.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=349319&r1=349318&r2=349319&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 Sun Nov 27 13:32:27 2005
@@ -19,6 +19,8 @@
package org.apache.ldap.server.storedprocs;
+import javax.naming.Context;
+import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttributes;
@@ -46,24 +48,57 @@
"JsgACEgO2AASxAAAAAQAKAAAACgACAAAABQAIAAYAAQANAAAAAgAO";
private static final byte[] HELLOWORLD_CLASS_BYTES = Base64.decode( HELLOWORLD_CLASS_BASE64.toCharArray() );
- public void testLoadingClass() throws Exception
+ protected void setUp() throws Exception
{
+ // bind to RootDSE
+ overrideEnvironment( Context.PROVIDER_URL, "" );
+ super.setUp();
+ }
+
+ public void testBasicStoredProcedureExecution() throws Exception
+ {
+ 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 );
- sysRoot.createSubcontext( "fqcn=HelloWorld", attributes );
- assertNotNull( sysRoot.lookup( "fqcn=HelloWorld" ) );
+ defaultContext.createSubcontext( "fqcn=HelloWorld", attributes );
+ // assert set up successfull
+ assertNotNull( defaultContext.lookup( "fqcn=HelloWorld" ) );
- // create the sp instance
+ // create the SP instance
StoredProcedure sp = new JavaStoredProcedure(
- ( ServerLdapContext ) ( sysRoot.lookup( "" ) ),
- "HelloWorld.main",
- new Class[] { String[].class }
+ RootDSE, // always RootDSE
+ "HelloWorld.main", // fully qualified Stored Procedure name
+ new Class[] { String[].class } // parameters' type
);
- // invoke the sp
+ // invoke the SP
sp.call( new Object[] { new String[] {} } );
+ }
+
+ public void testStoredProcedureExecutionOverServerLdapContextEntryPoint() 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" ) );
+
+ // 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-unit/src/test/java/org/apache/ldap/server/storedprocs/LdapClassLoaderTest.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/ersiner/apacheds-with-storedprocs/core-unit/src/test/java/org/apache/ldap/server/storedprocs/LdapClassLoaderTest.java?rev=349319&r1=349318&r2=349319&view=diff
==============================================================================
--- directory/sandbox/ersiner/apacheds-with-storedprocs/core-unit/src/test/java/org/apache/ldap/server/storedprocs/LdapClassLoaderTest.java (original)
+++ directory/sandbox/ersiner/apacheds-with-storedprocs/core-unit/src/test/java/org/apache/ldap/server/storedprocs/LdapClassLoaderTest.java Sun Nov 27 13:32:27 2005
@@ -19,8 +19,7 @@
package org.apache.ldap.server.storedprocs;
-import java.lang.reflect.Method;
-
+import javax.naming.Context;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttributes;
@@ -33,7 +32,7 @@
* Test case for LdapClassLoader.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @version $Rev$
+ * @version $Rev$ $Date$
*/
public class LdapClassLoaderTest extends AbstractAdminTestCase
{
@@ -47,24 +46,32 @@
"AAkAAAAdAAEAAQAAAAUqtwABsQAAAAEACgAAAAYAAQAAAAEACQALAAwAAQAJAAAAJQACAAEAAAA" +
"JsgACEgO2AASxAAAAAQAKAAAACgACAAAABQAIAAYAAQANAAAAAgAO";
private static final byte[] HELLOWORLD_CLASS_BYTES = Base64.decode( HELLOWORLD_CLASS_BASE64.toCharArray() );
-
+
+ protected void setUp() throws Exception
+ {
+ // bind to RootDSE
+ overrideEnvironment( Context.PROVIDER_URL, "" );
+ super.setUp();
+ }
+
public void testLoadingClass() throws Exception
{
+ // get default naming context to work on
+ ServerLdapContext defaultContext = ( ServerLdapContext ) sysRoot.lookup( "ou=system" );
+
// set up
Attributes attributes = new BasicAttributes( "objectClass", "top", true );
attributes.get( "objectClass" ).add( "javaClass" );
attributes.put( "fqcn", "HelloWorld" );
attributes.put( "byteCode", HELLOWORLD_CLASS_BYTES );
- sysRoot.createSubcontext( "fqcn=HelloWorld", attributes );
- assertNotNull( sysRoot.lookup( "fqcn=HelloWorld" ) );
+ defaultContext.createSubcontext( "fqcn=HelloWorld", attributes );
+ // assert set up successfull
+ assertNotNull( defaultContext.lookup( "fqcn=HelloWorld" ) );
// load the class
LdapClassLoader loader = new LdapClassLoader( ( ServerLdapContext ) ( sysRoot.lookup( "" ) ) );
Class clazz = loader.loadClass( "HelloWorld" );
+ // assert class loaded successfully
assertEquals( clazz.getName(), "HelloWorld" );
-
- // call a static method over loaded class via reflection
- Method m = clazz.getMethod("main", new Class[] { String[].class });
- m.invoke( null, new Object[] { new String[] {} } );
}
}
Modified: directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/JavaStoredProcedure.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/JavaStoredProcedure.java?rev=349319&r1=349318&r2=349319&view=diff
==============================================================================
--- directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/JavaStoredProcedure.java (original)
+++ directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/JavaStoredProcedure.java Sun Nov 27 13:32:27 2005
@@ -33,11 +33,11 @@
*/
public class JavaStoredProcedure implements StoredProcedure
{
- ServerLdapContext ctx;
- String fQSPName;
- Class[] parameterTypes;
- Method method;
- Class methodClass;
+ private ServerLdapContext ctx;
+ private String fQSPName;
+ private Class[] parameterTypes;
+ private Method method;
+ private Class methodClass;
public JavaStoredProcedure(
ServerLdapContext ctx,
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=349319&r1=349318&r2=349319&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 Sun Nov 27 13:32:27 2005
@@ -38,7 +38,7 @@
* A class loader that loads classes from an LDAP DIT.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @version $Rev$
+ * @version $Rev$ $Date$
*/
public class LdapClassLoader extends ClassLoader
{
@@ -63,21 +63,41 @@
controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
NamingEnumeration list = null;
+
try
- {
- list = ctx.search( new LdapName(), filter, controls );
- if ( list.hasMore() )
- {
- SearchResult result = ( SearchResult ) list.next();
- Attribute byteCode = result.getAttributes().get( "byteCode" );
- classBytes = ( byte[] ) byteCode.get();
- }
- else
- {
- String msg = "Class " + name + " not found in DIT.";
- log.warn( msg );
- throw new ClassNotFoundException( msg );
- }
+ {
+ 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;
+
+ while( namingContexts.hasMore() )
+ {
+ currentNamingContext = ( String ) namingContexts.next();
+
+ // search the class under the naming context considered
+ list = ( ( ServerLdapContext ) RootDSE.lookup( currentNamingContext ) ).search( new LdapName(), filter, controls );
+ if ( list.hasMore() )
+ {
+ SearchResult result = ( SearchResult ) list.next();
+ Attribute byteCode = result.getAttributes().get( "byteCode" );
+ classBytes = ( byte[] ) byteCode.get();
+ classFound = true;
+ continue;
+ }
+ }
+
+ if ( !classFound )
+ {
+ String msg = "Class " + name + " not found in DIT.";
+ log.warn( msg );
+ throw new ClassNotFoundException( msg );
+ }
}
catch ( NamingException e )
{