From commits-return-7149-apmail-directory-commits-archive=directory.apache.org@directory.apache.org Sat Dec 03 21:08:26 2005 Return-Path: Delivered-To: apmail-directory-commits-archive@www.apache.org Received: (qmail 26513 invoked from network); 3 Dec 2005 21:08:26 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 3 Dec 2005 21:08:26 -0000 Received: (qmail 6111 invoked by uid 500); 3 Dec 2005 21:08:26 -0000 Delivered-To: apmail-directory-commits-archive@directory.apache.org Received: (qmail 6086 invoked by uid 500); 3 Dec 2005 21:08:25 -0000 Mailing-List: contact commits-help@directory.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@directory.apache.org Delivered-To: mailing list commits@directory.apache.org Received: (qmail 6059 invoked by uid 99); 3 Dec 2005 21:08:25 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 03 Dec 2005 13:08:25 -0800 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Sat, 03 Dec 2005 13:08:24 -0800 Received: (qmail 26446 invoked by uid 65534); 3 Dec 2005 21:08:04 -0000 Message-ID: <20051203210804.26445.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r352015 - in /directory/protocol-providers/ldap/trunk: ./ src/main/java/org/apache/ldap/server/protocol/extended/ src/main/java/org/apache/ldap/server/protocol/extended/sp/ Date: Sat, 03 Dec 2005 21:08:03 -0000 To: commits@directory.apache.org From: ersiner@apache.org X-Mailer: svnmailer-1.0.5 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: ersiner Date: Sat Dec 3 13:07:50 2005 New Revision: 352015 URL: http://svn.apache.org/viewcvs?rev=352015&view=rev Log: Cleaning up. We still have a build problem. I could not import asn1new stuff from ldap-protocol. I'm not sure if this dependency makes things fails. We'll figure it out. Added: directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/ directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/sp/ directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/sp/JavaStoredProcedureExtendedOperationHandler.java directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/sp/LanguageSpecificStoredProceureExtendedOperationHandler.java directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/sp/StoredProcedureExtendedOperationHandler.java Modified: directory/protocol-providers/ldap/trunk/project.xml Modified: directory/protocol-providers/ldap/trunk/project.xml URL: http://svn.apache.org/viewcvs/directory/protocol-providers/ldap/trunk/project.xml?rev=352015&r1=352014&r2=352015&view=diff ============================================================================== --- directory/protocol-providers/ldap/trunk/project.xml (original) +++ directory/protocol-providers/ldap/trunk/project.xml Sat Dec 3 13:07:50 2005 @@ -195,6 +195,12 @@ 3.8.1 http://junit.org + + commons-lang + commons-lang + 2.1 + jar + Added: directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/sp/JavaStoredProcedureExtendedOperationHandler.java URL: http://svn.apache.org/viewcvs/directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/sp/JavaStoredProcedureExtendedOperationHandler.java?rev=352015&view=auto ============================================================================== --- directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/sp/JavaStoredProcedureExtendedOperationHandler.java (added) +++ directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/sp/JavaStoredProcedureExtendedOperationHandler.java Sat Dec 3 13:07:50 2005 @@ -0,0 +1,160 @@ +/* + * Copyright 2005 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.ldap.server.protocol.extended.sp; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import javax.naming.NamingException; + +import org.apache.asn1.codec.util.StringUtils; +import org.apache.ldap.common.message.extended.ParameterPojo; +import org.apache.ldap.common.message.extended.StoredProcedurePojo; +import org.apache.ldap.server.jndi.ServerLdapContext; +import org.apache.ldap.server.storedprocs.SpringClassUtils; + + + +/** + * + * @author Apache Directory Project + * @version $Rev$ $Date$ + */ +public class JavaStoredProcedureExtendedOperationHandler implements LanguageSpecificStoredProceureExtendedOperationHandler +{ + public JavaStoredProcedureExtendedOperationHandler() + { + + } + + public void handleStoredProcedureExtendedOperation( ServerLdapContext ctx, StoredProcedurePojo pojo ) throws ClassNotFoundException, NamingException + { + List types = new ArrayList( pojo.getParameters().size() ); + List values = new ArrayList( pojo.getParameters().size() ); + + Iterator it = pojo.getParameters().iterator(); + while ( it.hasNext() ) + { + ParameterPojo pPojo = ( ParameterPojo ) it.next(); + + // get type from String even if it holds a primitive type name + Class type = SpringClassUtils.forName( StringUtils.utf8ToString( pPojo.getType() ) ); + + types.add( type ); + + byte[] value = pPojo.getValue(); + + /** + * If the type name refers to a Java primitive then + * we know that the value is encoded as its String representation and + * we retrive the String and initialize a wrapper of the primitive. + */ + if ( type.isPrimitive() ) + { + values.add( getInitializedPrimitiveWrapperInstance( type, value ) ); + } + /** + * If the type is a complex Java type then + * just deserialize the object. + */ + else + { + try + { + // TODO Irritating syntax! Just wanted to see how it looks like.. + values.add + ( + ( + new ObjectInputStream + ( + new ByteArrayInputStream( value ) + ) + ).readObject() + ); + } + catch (IOException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + catch (ClassNotFoundException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + + // TODO determine what to do with the exception + ctx.executeProcedure( + StringUtils.utf8ToString( pojo.getProcedure() ), + ( Class[] ) types.toArray(), + values.toArray() + ); + } + + private Object getInitializedPrimitiveWrapperInstance( Class type, byte[] value ) + { + Object instance = null; + try + { + instance = org.apache.commons.lang.ClassUtils + .primitiveToWrapper( type ) + .getConstructor( new Class[] {String.class} ) + .newInstance( new Object[] { StringUtils.utf8ToString( value ) } ); + } + catch (IllegalArgumentException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + catch (SecurityException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + catch (InstantiationException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + catch (IllegalAccessException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + catch (InvocationTargetException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + catch (NoSuchMethodException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return instance; + } +} Added: directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/sp/LanguageSpecificStoredProceureExtendedOperationHandler.java URL: http://svn.apache.org/viewcvs/directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/sp/LanguageSpecificStoredProceureExtendedOperationHandler.java?rev=352015&view=auto ============================================================================== --- directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/sp/LanguageSpecificStoredProceureExtendedOperationHandler.java (added) +++ directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/sp/LanguageSpecificStoredProceureExtendedOperationHandler.java Sat Dec 3 13:07:50 2005 @@ -0,0 +1,44 @@ +/* + * Copyright 2005 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.ldap.server.protocol.extended.sp; + +import org.apache.ldap.common.message.extended.StoredProcedurePojo; +import org.apache.ldap.server.jndi.ServerLdapContext; + + +/** + * An extension (hook) point that enables an implementor to provide his or her + * own Stored Procedure Extended Operation handler. + * + * @author Apache Directory Project + * @version $Rev$ $Date$ + * + */ +public interface LanguageSpecificStoredProceureExtendedOperationHandler +{ + /** + * Handles the specified extended operation. + * + * @param session the MINA session object related with current connection + * @param req the LDAP Extended operation request + * + * @throws Exception if failed to handle the operation + */ + void handleStoredProcedureExtendedOperation( ServerLdapContext ctx, StoredProcedurePojo pojo ) throws Exception; +} Added: directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/sp/StoredProcedureExtendedOperationHandler.java URL: http://svn.apache.org/viewcvs/directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/sp/StoredProcedureExtendedOperationHandler.java?rev=352015&view=auto ============================================================================== --- directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/sp/StoredProcedureExtendedOperationHandler.java (added) +++ directory/protocol-providers/ldap/trunk/src/main/java/org/apache/ldap/server/protocol/extended/sp/StoredProcedureExtendedOperationHandler.java Sat Dec 3 13:07:50 2005 @@ -0,0 +1,85 @@ +/* + * Copyright 2005 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.ldap.server.protocol.extended.sp; + + +import java.nio.ByteBuffer; + +import org.apache.asn1.codec.DecoderException; +import org.apache.ldap.common.message.Control; +import org.apache.ldap.common.message.ExtendedRequest; +import org.apache.ldap.common.message.extended.StoredProcedurePojo; +import org.apache.ldap.server.jndi.ServerLdapContext; +import org.apache.ldap.server.protocol.ExtendedOperationHandler; +import org.apache.ldap.server.protocol.SessionRegistry; +import org.apache.mina.common.IoSession; + + +/** + * + * @author Apache Directory Project + * @version $Rev$ $Date$ + */ +public class StoredProcedureExtendedOperationHandler implements ExtendedOperationHandler +{ + + public String getOid() + { + return "1.2.3.4.55.666.7777"; + } + + public void handleExtendedOperation( IoSession session, SessionRegistry registry, ExtendedRequest req ) throws Exception + { + Control[] connCtls = ( Control[] ) req.getControls().toArray( new Control[ req.getControls().size() ] ); + ServerLdapContext serverLdapContext = ( ServerLdapContext ) registry.getLdapContext( session, connCtls, false); + StoredProcedurePojo pojo = decodePojo( req.getPayload() ); + + // TODO This block will be replaced by a handler initiator via a factory. Now just trying to make things work. + if ( pojo.getLanguage().equals( "Java" ) ) + { + JavaStoredProcedureExtendedOperationHandler handler = new JavaStoredProcedureExtendedOperationHandler(); + handler.handleStoredProcedureExtendedOperation( serverLdapContext, pojo ); + } + } + + private StoredProcedurePojo decodePojo( byte[] payload ) + { + Asn1Decoder storedProcedureDecoder = new StoredProcedureDecoder(); + + ByteBuffer stream = ByteBuffer.wrap( payload ); + + // Allocate a StoredProcedure Container + IAsn1Container storedProcedureContainer = new StoredProcedureContainer(); + + // Decode a StoredProcedure message + try + { + storedProcedureDecoder.decode( stream, storedProcedureContainer ); + } + catch (DecoderException de) + { + de.printStackTrace(); + } + + StoredProcedurePojo pojo = ( ( StoredProcedureContainer ) storedProcedureContainer ) + .getStoredProcedurePojo(); + + return pojo; + } +}