001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 *
019 */
020 package org.apache.directory.server.ldap.handlers.extended;
021
022
023 import java.io.Serializable;
024 import java.nio.ByteBuffer;
025 import java.util.ArrayList;
026 import java.util.Collections;
027 import java.util.HashSet;
028 import java.util.List;
029 import java.util.Set;
030
031 import org.apache.commons.lang.SerializationUtils;
032 import org.apache.directory.server.core.entry.ClonedServerEntry;
033 import org.apache.directory.server.core.sp.StoredProcEngine;
034 import org.apache.directory.server.core.sp.StoredProcEngineConfig;
035 import org.apache.directory.server.core.sp.StoredProcExecutionManager;
036 import org.apache.directory.server.core.sp.java.JavaStoredProcEngineConfig;
037 import org.apache.directory.server.ldap.ExtendedOperationHandler;
038 import org.apache.directory.server.ldap.LdapServer;
039 import org.apache.directory.server.ldap.LdapSession;
040 import org.apache.directory.shared.asn1.ber.Asn1Decoder;
041 import org.apache.directory.shared.asn1.ber.IAsn1Container;
042 import org.apache.directory.shared.ldap.codec.extended.operations.storedProcedure.StoredProcedure;
043 import org.apache.directory.shared.ldap.codec.extended.operations.storedProcedure.StoredProcedureContainer;
044 import org.apache.directory.shared.ldap.codec.extended.operations.storedProcedure.StoredProcedureDecoder;
045 import org.apache.directory.shared.ldap.codec.extended.operations.storedProcedure.StoredProcedure.StoredProcedureParameter;
046 import org.apache.directory.shared.ldap.message.InternalExtendedRequest;
047 import org.apache.directory.shared.ldap.message.InternalExtendedResponse;
048 import org.apache.directory.shared.ldap.message.extended.StoredProcedureRequest;
049 import org.apache.directory.shared.ldap.message.extended.StoredProcedureResponse;
050 import org.apache.directory.shared.ldap.name.LdapDN;
051 import org.apache.directory.shared.ldap.sp.LdapContextParameter;
052 import org.apache.directory.shared.ldap.util.StringTools;
053
054
055 /**
056 * @org.apache.xbean.XBean
057 *
058 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
059 * @version $Rev$ $Date$
060 */
061 public class StoredProcedureExtendedOperationHandler implements ExtendedOperationHandler
062 {
063 private StoredProcExecutionManager manager;
064 private static final Object[] EMPTY_CLASS_ARRAY = new Object[0];
065
066
067 public StoredProcedureExtendedOperationHandler()
068 {
069 super();
070 //StoredProcEngineConfig javaxScriptSPEngineConfig = new JavaxStoredProcEngineConfig();
071 StoredProcEngineConfig javaSPEngineConfig = new JavaStoredProcEngineConfig();
072 List<StoredProcEngineConfig> spEngineConfigs = new ArrayList<StoredProcEngineConfig>();
073 //spEngineConfigs.add( javaxScriptSPEngineConfig );
074 spEngineConfigs.add( javaSPEngineConfig );
075 String spContainer = "ou=Stored Procedures,ou=system";
076 this.manager = new StoredProcExecutionManager( spContainer, spEngineConfigs );
077 }
078
079
080 public void handleExtendedOperation( LdapSession session, InternalExtendedRequest req ) throws Exception
081 {
082 StoredProcedure spBean = decodeBean( req.getPayload() );
083
084 String procedure = StringTools.utf8ToString( spBean.getProcedure() );
085 ClonedServerEntry spUnit = manager.findStoredProcUnit( session.getCoreSession(), procedure );
086 StoredProcEngine engine = manager.getStoredProcEngineInstance( spUnit );
087
088 List<Object> valueList = new ArrayList<Object>( spBean.getParameters().size() );
089
090 for ( StoredProcedureParameter pPojo:spBean.getParameters() )
091 {
092 byte[] serializedValue = pPojo.getValue();
093 Object value = SerializationUtils.deserialize( serializedValue );
094
095 if ( value.getClass().equals( LdapContextParameter.class ) )
096 {
097 String paramCtx = ( ( LdapContextParameter ) value ).getValue();
098 value = session.getCoreSession().lookup( new LdapDN( paramCtx ) );
099 }
100
101 valueList.add( value );
102 }
103
104 Object[] values = valueList.toArray( EMPTY_CLASS_ARRAY );
105
106 Object response = engine.invokeProcedure( session.getCoreSession(), procedure, values );
107
108 byte[] serializedResponse = SerializationUtils.serialize( ( Serializable ) response );
109 ( ( InternalExtendedResponse )( req.getResultResponse() ) ).setResponse( serializedResponse );
110 session.getIoSession().write( req.getResultResponse() );
111
112 }
113
114 private StoredProcedure decodeBean( byte[] payload )
115 {
116 Asn1Decoder storedProcedureDecoder = new StoredProcedureDecoder();
117 ByteBuffer stream = ByteBuffer.wrap( payload );
118 IAsn1Container storedProcedureContainer = new StoredProcedureContainer();
119
120 try
121 {
122 storedProcedureDecoder.decode( stream, storedProcedureContainer );
123 }
124 catch ( Exception de )
125 {
126 de.printStackTrace();
127 }
128
129 StoredProcedure spBean = ( ( StoredProcedureContainer ) storedProcedureContainer ).getStoredProcedure();
130
131 return spBean;
132 }
133
134
135 public String getOid()
136 {
137 return StoredProcedureRequest.EXTENSION_OID;
138 }
139
140
141 private static final Set<String> EXTENSION_OIDS;
142
143 static
144 {
145 Set<String> s = new HashSet<String>();
146 s.add( StoredProcedureRequest.EXTENSION_OID );
147 s.add( StoredProcedureResponse.EXTENSION_OID );
148 EXTENSION_OIDS = Collections.unmodifiableSet( s );
149 }
150
151
152 public Set<String> getExtensionOids()
153 {
154 return EXTENSION_OIDS;
155 }
156
157
158 public void setLdapServer( LdapServer ldapServer )
159 {
160 }
161 }