View Javadoc

1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    *  
10   *    http://www.apache.org/licenses/LICENSE-2.0
11   *  
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License. 
18   *  
19   */
20  
21  
22  package org.apache.directory.server.ldap.handlers.extended;
23  
24  
25  import java.io.Serializable;
26  import java.nio.ByteBuffer;
27  import java.util.ArrayList;
28  import java.util.Collections;
29  import java.util.HashSet;
30  import java.util.List;
31  import java.util.Set;
32  
33  import org.apache.commons.lang.SerializationUtils;
34  import org.apache.directory.server.core.entry.ClonedServerEntry;
35  import org.apache.directory.server.core.sp.StoredProcEngine;
36  import org.apache.directory.server.core.sp.StoredProcEngineConfig;
37  import org.apache.directory.server.core.sp.StoredProcExecutionManager;
38  import org.apache.directory.server.core.sp.java.JavaStoredProcEngineConfig;
39  import org.apache.directory.server.ldap.ExtendedOperationHandler;
40  import org.apache.directory.server.ldap.LdapService;
41  import org.apache.directory.server.ldap.LdapSession;
42  import org.apache.directory.shared.asn1.ber.Asn1Decoder;
43  import org.apache.directory.shared.asn1.ber.IAsn1Container;
44  import org.apache.directory.shared.ldap.codec.extended.operations.StoredProcedure;
45  import org.apache.directory.shared.ldap.codec.extended.operations.StoredProcedureContainer;
46  import org.apache.directory.shared.ldap.codec.extended.operations.StoredProcedureDecoder;
47  import org.apache.directory.shared.ldap.codec.extended.operations.StoredProcedure.StoredProcedureParameter;
48  import org.apache.directory.shared.ldap.message.ExtendedRequest;
49  import org.apache.directory.shared.ldap.message.ExtendedResponse;
50  import org.apache.directory.shared.ldap.message.extended.StoredProcedureRequest;
51  import org.apache.directory.shared.ldap.message.extended.StoredProcedureResponse;
52  import org.apache.directory.shared.ldap.name.LdapDN;
53  import org.apache.directory.shared.ldap.sp.LdapContextParameter;
54  import org.apache.directory.shared.ldap.util.StringTools;
55  
56  
57  /**
58   * @org.apache.xbean.XBean
59   *
60   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
61   * @version $Rev$ $Date$
62   */
63  public class StoredProcedureExtendedOperationHandler implements ExtendedOperationHandler
64  {
65      private StoredProcExecutionManager manager;
66      private static final Object[] EMPTY_CLASS_ARRAY = new Object[0];
67      
68      
69      public StoredProcedureExtendedOperationHandler()
70      {
71          super();
72          //StoredProcEngineConfig javaxScriptSPEngineConfig = new JavaxStoredProcEngineConfig();
73          StoredProcEngineConfig javaSPEngineConfig = new JavaStoredProcEngineConfig();
74          List<StoredProcEngineConfig> spEngineConfigs = new ArrayList<StoredProcEngineConfig>();
75          //spEngineConfigs.add( javaxScriptSPEngineConfig );
76          spEngineConfigs.add( javaSPEngineConfig );
77          String spContainer = "ou=Stored Procedures,ou=system";
78          this.manager = new StoredProcExecutionManager( spContainer, spEngineConfigs );
79      }
80  
81  
82      public void handleExtendedOperation( LdapSession session, ExtendedRequest req ) throws Exception
83      {
84          StoredProcedure spBean = decodeBean( req.getPayload() );
85          
86          String procedure = StringTools.utf8ToString( spBean.getProcedure() );
87          ClonedServerEntry spUnit = manager.findStoredProcUnit( session.getCoreSession(), procedure );
88          StoredProcEngine engine = manager.getStoredProcEngineInstance( spUnit );
89          
90          List<Object> valueList = new ArrayList<Object>( spBean.getParameters().size() );
91          
92          for ( StoredProcedureParameter pPojo:spBean.getParameters() )
93          {
94              byte[] serializedValue = pPojo.getValue();
95              Object value = SerializationUtils.deserialize( serializedValue );
96              
97              if ( value.getClass().equals( LdapContextParameter.class ) )
98              {
99                  String paramCtx = ( ( LdapContextParameter ) value ).getValue();
100                 value = session.getCoreSession().lookup( new LdapDN( paramCtx ) );
101             }
102             
103             valueList.add( value );
104         }
105         
106         Object[] values = valueList.toArray( EMPTY_CLASS_ARRAY );
107         
108         Object response = engine.invokeProcedure( session.getCoreSession(), procedure, values );
109         
110         byte[] serializedResponse = SerializationUtils.serialize( ( Serializable ) response );
111         ( ( ExtendedResponse )( req.getResultResponse() ) ).setResponse( serializedResponse );
112         session.getIoSession().write( req.getResultResponse() );
113         
114     }
115     
116     private StoredProcedure decodeBean( byte[] payload )
117     {
118         Asn1Decoder storedProcedureDecoder = new StoredProcedureDecoder();
119         ByteBuffer stream = ByteBuffer.wrap( payload );
120         IAsn1Container storedProcedureContainer = new StoredProcedureContainer();
121 
122         try
123         {
124             storedProcedureDecoder.decode( stream, storedProcedureContainer );
125         }
126         catch ( Exception de )
127         {
128             de.printStackTrace();
129         }
130 
131         StoredProcedure spBean = ( ( StoredProcedureContainer ) storedProcedureContainer ).getStoredProcedure();
132         
133         return spBean;
134     }
135 
136     
137     public String getOid()
138     {
139         return StoredProcedureRequest.EXTENSION_OID;
140     }
141 
142 
143     private static final Set<String> EXTENSION_OIDS;
144     
145     static
146     {
147         Set<String> s = new HashSet<String>();
148         s.add( StoredProcedureRequest.EXTENSION_OID );
149         s.add( StoredProcedureResponse.EXTENSION_OID );
150         EXTENSION_OIDS = Collections.unmodifiableSet( s );
151     }
152     
153     
154     public Set<String> getExtensionOids()
155     {
156         return EXTENSION_OIDS;
157     }
158 
159 
160     public void setLdapServer( LdapService ldapService )
161     {
162     }
163 }