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 2007/08/29 20:12:33 UTC

svn commit: r570883 - in /directory: apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/support/extended/ apacheds/trunk/server-unit/src/test/java/org/apache/directory/server/ shared/trunk/ldap/src/main/java/org/apache/director...

Author: ersiner
Date: Wed Aug 29 11:12:32 2007
New Revision: 570883

URL: http://svn.apache.org/viewvc?rev=570883&view=rev
Log:
Refactored external stored procedure execution framework to use new schema elements and corresponding codes.


Removed:
    directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/support/extended/JavaStoredProcedureExtendedOperationHandler.java
    directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/support/extended/LanguageSpecificStoredProceureExtendedOperationHandler.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/sp/JavaStoredProcedureUtils.java
Modified:
    directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/support/extended/StoredProcedureExtendedOperationHandler.java
    directory/apacheds/trunk/server-unit/src/test/java/org/apache/directory/server/StoredProcedureTest.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/sp/BaseJavaStoredProcUtils.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/sp/LdapContextParameter.java

Modified: directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/support/extended/StoredProcedureExtendedOperationHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/support/extended/StoredProcedureExtendedOperationHandler.java?rev=570883&r1=570882&r2=570883&view=diff
==============================================================================
--- directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/support/extended/StoredProcedureExtendedOperationHandler.java (original)
+++ directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/support/extended/StoredProcedureExtendedOperationHandler.java Wed Aug 29 11:12:32 2007
@@ -22,15 +22,25 @@
 package org.apache.directory.server.ldap.support.extended;
 
 
+import java.io.Serializable;
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Set;
 
+import javax.naming.directory.Attributes;
 import javax.naming.ldap.Control;
 import javax.naming.ldap.LdapContext;
 
+import org.apache.commons.lang.SerializationUtils;
 import org.apache.directory.server.core.jndi.ServerLdapContext;
+import org.apache.directory.server.core.sp.StoredProcEngine;
+import org.apache.directory.server.core.sp.StoredProcEngineConfig;
+import org.apache.directory.server.core.sp.StoredProcExecutionManager;
+import org.apache.directory.server.core.sp.java.JavaStoredProcEngineConfig;
 import org.apache.directory.server.ldap.ExtendedOperationHandler;
 import org.apache.directory.server.ldap.LdapProtocolProvider;
 import org.apache.directory.server.ldap.SessionRegistry;
@@ -39,10 +49,13 @@
 import org.apache.directory.shared.ldap.codec.extended.operations.StoredProcedure;
 import org.apache.directory.shared.ldap.codec.extended.operations.StoredProcedureContainer;
 import org.apache.directory.shared.ldap.codec.extended.operations.StoredProcedureDecoder;
+import org.apache.directory.shared.ldap.codec.extended.operations.StoredProcedure.StoredProcedureParameter;
 import org.apache.directory.shared.ldap.message.ExtendedRequest;
 import org.apache.directory.shared.ldap.message.ExtendedResponse;
 import org.apache.directory.shared.ldap.message.extended.StoredProcedureRequest;
 import org.apache.directory.shared.ldap.message.extended.StoredProcedureResponse;
+import org.apache.directory.shared.ldap.sp.LdapContextParameter;
+import org.apache.directory.shared.ldap.util.StringTools;
 import org.apache.mina.common.IoSession;
 
 
@@ -52,42 +65,61 @@
  */
 public class StoredProcedureExtendedOperationHandler implements ExtendedOperationHandler
 {
+    private StoredProcExecutionManager manager;
+    private static final Object[] EMPTY_CLASS_ARRAY = new Object[0];
+    public StoredProcedureExtendedOperationHandler()
+    {
+        super();
+        //StoredProcEngineConfig javaxScriptSPEngineConfig = new JavaxStoredProcEngineConfig();
+        StoredProcEngineConfig javaSPEngineConfig = new JavaStoredProcEngineConfig();
+        List<StoredProcEngineConfig> spEngineConfigs = new ArrayList<StoredProcEngineConfig>();
+        //spEngineConfigs.add( javaxScriptSPEngineConfig );
+        spEngineConfigs.add( javaSPEngineConfig );
+        String spContainer = "ou=Stored Procedures,ou=system";
+        this.manager = new StoredProcExecutionManager( spContainer, spEngineConfigs );
+    }
+
     public void handleExtendedOperation( IoSession session, SessionRegistry registry, ExtendedRequest req ) throws Exception
     {
         Control[] connCtls = req.getControls().values().toArray( new Control[ req.getControls().size() ] );
         LdapContext ldapContext = registry.getLdapContext( session, connCtls, false);
-        ServerLdapContext serverLdapContext;
+        ServerLdapContext ctx;
         
         if ( ldapContext instanceof ServerLdapContext )
         {
-            serverLdapContext = ( ServerLdapContext ) ldapContext;
+            ctx = ( ServerLdapContext ) ldapContext;
         }
         else
         {
-            serverLdapContext = ( ServerLdapContext ) ldapContext.lookup( "" );
+            ctx = ( ServerLdapContext ) ldapContext.lookup( "" );
         }
         
         StoredProcedure spBean = decodeBean( req.getPayload() );
         
-        LanguageSpecificStoredProceureExtendedOperationHandler handler = null;
-        
-        byte[] responseStream = null;
-        
-        /**
-         * TODO This part may be replaced by a better handler determiner.
-         */
-        if ( spBean.getLanguage().equalsIgnoreCase( "Java" ) )
+        String procedure = StringTools.utf8ToString( spBean.getProcedure() );
+        Attributes spUnit = manager.findStoredProcUnit( ctx, procedure );
+        StoredProcEngine engine = manager.getStoredProcEngineInstance( spUnit );
+        
+        List valueList = new ArrayList( spBean.getParameters().size() );
+        Iterator<StoredProcedureParameter> it = spBean.getParameters().iterator();
+        while ( it.hasNext() )
         {
-            handler = new JavaStoredProcedureExtendedOperationHandler();
-            responseStream = handler.handleStoredProcedureExtendedOperation( serverLdapContext, spBean );
+            StoredProcedureParameter pPojo = it.next();
+            byte[] serializedValue = pPojo.getValue();
+            Object value = SerializationUtils.deserialize( serializedValue );
+            if ( value.getClass().equals( LdapContextParameter.class ) )
+            {
+                String paramCtx = ( ( LdapContextParameter ) value ).getValue();
+                value = ctx.lookup( paramCtx );
+            }
+            valueList.add( value );
         }
+        Object[] values = valueList.toArray( EMPTY_CLASS_ARRAY );
         
-        /**
-         * FIXME: We may have issues sending SP result back to the client.
-         */
-        
-        ( ( ExtendedResponse )( req.getResultResponse() ) ).setResponse( responseStream );
+        Object response = engine.invokeProcedure( ctx, procedure, values );
         
+        byte[] serializedResponse = SerializationUtils.serialize( ( Serializable ) response );
+        ( ( ExtendedResponse )( req.getResultResponse() ) ).setResponse( serializedResponse );
         session.write( req.getResultResponse() );
         
     }

Modified: directory/apacheds/trunk/server-unit/src/test/java/org/apache/directory/server/StoredProcedureTest.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/server-unit/src/test/java/org/apache/directory/server/StoredProcedureTest.java?rev=570883&r1=570882&r2=570883&view=diff
==============================================================================
--- directory/apacheds/trunk/server-unit/src/test/java/org/apache/directory/server/StoredProcedureTest.java (original)
+++ directory/apacheds/trunk/server-unit/src/test/java/org/apache/directory/server/StoredProcedureTest.java Wed Aug 29 11:12:32 2007
@@ -27,6 +27,7 @@
 
 import javax.naming.NameNotFoundException;
 import javax.naming.NamingException;
+import javax.naming.directory.Attributes;
 import javax.naming.ldap.InitialLdapContext;
 import javax.naming.ldap.LdapContext;
 
@@ -34,8 +35,9 @@
 import org.apache.directory.server.ldap.LdapConfiguration;
 import org.apache.directory.server.ldap.support.extended.StoredProcedureExtendedOperationHandler;
 import org.apache.directory.server.unit.AbstractServerTest;
+import org.apache.directory.shared.ldap.message.AttributesImpl;
 import org.apache.directory.shared.ldap.name.LdapDN;
-import org.apache.directory.shared.ldap.sp.JavaStoredProcedureUtils;
+import org.apache.directory.shared.ldap.sp.BaseJavaStoredProcUtils;
 import org.apache.directory.shared.ldap.sp.LdapContextParameter;
 
 
@@ -46,6 +48,7 @@
 public class StoredProcedureTest extends AbstractServerTest
 {
     private LdapContext ctx = null;
+    private LdapContext spCtx = null;
 
     
     public void setUp() throws Exception
@@ -67,6 +70,11 @@
         env.put( "java.naming.security.credentials", "secret" );
         env.put( "java.naming.security.authentication", "simple" );
         ctx = new InitialLdapContext( env, null );
+        
+        Attributes spContainer = new AttributesImpl( "objectClass", "top", true );
+        spContainer.get( "objectClass" ).add( "organizationalUnit" );
+        spContainer.put( "ou", "Stored Procedures" );
+        spCtx = ( LdapContext ) ctx.createSubcontext( "ou=Stored Procedures", spContainer );
     }
 
 
@@ -81,11 +89,11 @@
 
     public void testExecuteProcedureWithReturnValue() throws NamingException
     {
-        String procedureName = HelloWorldProcedure.class.getName() + ".sayHello";
+        String procedureName = HelloWorldProcedure.class.getName() + ":sayHello";
         
-        JavaStoredProcedureUtils.loadStoredProcedureClass( ctx, HelloWorldProcedure.class );
+        BaseJavaStoredProcUtils.loadStoredProcedureClass( spCtx, HelloWorldProcedure.class );
         
-        Object response = JavaStoredProcedureUtils.callStoredProcedure( ctx, procedureName, new Object[] { } );
+        Object response = BaseJavaStoredProcUtils.callStoredProcedure( ctx, procedureName, new Object[] { } );
         
         assertEquals( "Hello World!", response );
     }
@@ -93,11 +101,11 @@
 
     public void testExecuteProcedureWithParametersAndReturnValue() throws NamingException, IOException
     {
-        String procedureName = HelloWorldProcedure.class.getName() + ".sayHelloTo";
+        String procedureName = HelloWorldProcedure.class.getName() + ":sayHelloTo";
         
-        JavaStoredProcedureUtils.loadStoredProcedureClass( ctx, HelloWorldProcedure.class );
+        BaseJavaStoredProcUtils.loadStoredProcedureClass( spCtx, HelloWorldProcedure.class );
         
-        Object response = JavaStoredProcedureUtils.callStoredProcedure( ctx, procedureName, new Object[] { "Ersin" } );
+        Object response = BaseJavaStoredProcUtils.callStoredProcedure( ctx, procedureName, new Object[] { "Ersin" } );
         
         assertEquals( "Hello Ersin!", response );
     }
@@ -127,13 +135,13 @@
         
         injectEntries( ldif );
         
-        JavaStoredProcedureUtils.loadStoredProcedureClass( ctx, DITUtilitiesSP.class );
+        BaseJavaStoredProcUtils.loadStoredProcedureClass( spCtx, DITUtilitiesSP.class );
         
-        String spName = DITUtilitiesSP.class.getName() + ".deleteSubtree";
+        String spName = DITUtilitiesSP.class.getName() + ":deleteSubtree";
         Object[] params = new Object[] { new LdapContextParameter( "ou=system" ),
                                          new LdapDN( "ou=People" ) };
         
-        JavaStoredProcedureUtils.callStoredProcedure( ctx, spName, params );
+        BaseJavaStoredProcUtils.callStoredProcedure( ctx, spName, params );
         
         try
         {

Modified: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/sp/BaseJavaStoredProcUtils.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/sp/BaseJavaStoredProcUtils.java?rev=570883&r1=570882&r2=570883&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/sp/BaseJavaStoredProcUtils.java (original)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/sp/BaseJavaStoredProcUtils.java Wed Aug 29 11:12:32 2007
@@ -24,14 +24,18 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.Serializable;
 import java.net.URL;
 
 import javax.naming.NamingException;
 import javax.naming.directory.Attributes;
 import javax.naming.ldap.LdapContext;
 
+import org.apache.commons.lang.SerializationUtils;
 import org.apache.directory.shared.ldap.constants.SchemaConstants;
 import org.apache.directory.shared.ldap.message.AttributesImpl;
+import org.apache.directory.shared.ldap.message.extended.StoredProcedureRequest;
+import org.apache.directory.shared.ldap.message.extended.StoredProcedureResponse;
 
 /**
  * A utility class for working with Java Stored Procedures at the base level.
@@ -101,6 +105,54 @@
         attributes.put( "javaByteCode", buf );
         
         ctx.createSubcontext( "storedProcUnitName=" + fullClassName , attributes );
+    }
+    
+    public static Object callStoredProcedure( LdapContext ctx, String procedureName, Object[] arguments ) throws NamingException
+    {
+        String language = "Java";
+        
+        Object responseObject;
+        try
+        {
+            /**
+             * Create a new stored procedure execution request.
+             */
+            StoredProcedureRequest req = new StoredProcedureRequest( 0, procedureName, language );
+            
+            /**
+             * For each argument UTF-8-encode the type name
+             * and Java-serialize the value
+             * and add them to the request as a parameter object.
+             */
+            for ( int i = 0; i < arguments.length; i++ )
+            {
+                byte[] type;
+                byte[] value;
+                type = arguments[i].getClass().getName().getBytes( "UTF-8" );
+                value = SerializationUtils.serialize( ( Serializable ) arguments[i] );
+                req.addParameter( type, value );
+            }
+            
+            /**
+             * Call the stored procedure via the extended operation
+             * and get back its return value.
+             */
+            StoredProcedureResponse resp = ( StoredProcedureResponse ) ctx.extendedOperation( req );
+            
+            /**
+             * Restore a Java object from the return value.
+             */
+            byte[] responseStream = resp.getEncodedValue();
+            responseObject = SerializationUtils.deserialize( responseStream );
+        }
+        catch ( Exception e )
+        {
+            NamingException ne = new NamingException();
+            ne.setRootCause( e );
+            throw ne;
+        }
+        
+        return responseObject;
     }
     
 }

Modified: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/sp/LdapContextParameter.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/sp/LdapContextParameter.java?rev=570883&r1=570882&r2=570883&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/sp/LdapContextParameter.java (original)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/sp/LdapContextParameter.java Wed Aug 29 11:12:32 2007
@@ -20,6 +20,8 @@
 
 package org.apache.directory.shared.ldap.sp;
 
+import java.io.Serializable;
+
 
 
 /**
@@ -28,8 +30,10 @@
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev:$
  */
-public class LdapContextParameter
+public class LdapContextParameter implements Serializable
 {
+    private static final long serialVersionUID = -8703671542595407603L;
+    
     private String name;
 
     public LdapContextParameter( String name )
@@ -37,12 +41,7 @@
         this.name = name;
     }
     
-    public String getType()
-    {
-        return "$ldapContext";
-    }
-    
-    public Object getValue()
+    public String getValue()
     {
         return name;
     }