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  package org.apache.directory.server.ldap.handlers.extended;
21  
22  
23  import java.io.Serializable;
24  import java.util.ArrayList;
25  import java.util.Collections;
26  import java.util.HashSet;
27  import java.util.List;
28  import java.util.Set;
29  
30  import org.apache.commons.lang3.SerializationUtils;
31  import org.apache.directory.api.ldap.codec.api.LdapApiService;
32  import org.apache.directory.api.ldap.extras.extended.ads_impl.storedProcedure.StoredProcedureFactory;
33  import org.apache.directory.api.ldap.extras.extended.storedProcedure.StoredProcedureRequest;
34  import org.apache.directory.api.ldap.extras.extended.storedProcedure.StoredProcedureResponse;
35  import org.apache.directory.api.ldap.model.entry.Entry;
36  import org.apache.directory.api.ldap.model.name.Dn;
37  import org.apache.directory.api.ldap.sp.LdapContextParameter;
38  import org.apache.directory.server.core.api.sp.StoredProcEngine;
39  import org.apache.directory.server.core.api.sp.StoredProcEngineConfig;
40  import org.apache.directory.server.core.api.sp.StoredProcExecutionManager;
41  import org.apache.directory.server.core.api.sp.java.JavaStoredProcEngineConfig;
42  import org.apache.directory.server.ldap.ExtendedOperationHandler;
43  import org.apache.directory.server.ldap.LdapServer;
44  import org.apache.directory.server.ldap.LdapSession;
45  
46  
47  /**
48   * A Handler for the StoredProcedure extended operation
49   *
50   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
51   */
52  public class StoredProcedureExtendedOperationHandler implements
53      ExtendedOperationHandler<StoredProcedureRequest, StoredProcedureResponse>
54  {
55      private StoredProcExecutionManager manager;
56      private static final Object[] EMPTY_CLASS_ARRAY = new Object[0];
57  
58  
59      public StoredProcedureExtendedOperationHandler()
60      {
61          super();
62          //StoredProcEngineConfig javaxScriptSPEngineConfig = new JavaxStoredProcEngineConfig();
63          StoredProcEngineConfig javaSPEngineConfig = new JavaStoredProcEngineConfig();
64          List<StoredProcEngineConfig> spEngineConfigs = new ArrayList<>();
65          //spEngineConfigs.add( javaxScriptSPEngineConfig );
66          spEngineConfigs.add( javaSPEngineConfig );
67          String spContainer = "ou=Stored Procedures,ou=system";
68          this.manager = new StoredProcExecutionManager( spContainer, spEngineConfigs );
69      }
70  
71  
72      @Override
73      public void handleExtendedOperation( LdapSession session, StoredProcedureRequest req ) throws Exception
74      {
75          String procedure = req.getProcedureSpecification();
76          Entry spUnit = manager.findStoredProcUnit( session.getCoreSession(), procedure );
77          StoredProcEngine engine = manager.getStoredProcEngineInstance( spUnit );
78  
79          List<Object> valueList = new ArrayList<>( req.size() );
80  
81          for ( int ii = 0; ii < req.size(); ii++ )
82          {
83              byte[] serializedValue = ( byte[] ) req.getParameterValue( ii );
84              Object value = SerializationUtils.deserialize( serializedValue );
85  
86              if ( value.getClass().equals( LdapContextParameter.class ) )
87              {
88                  String paramCtx = ( ( LdapContextParameter ) value ).getValue();
89                  value = session.getCoreSession().lookup( new Dn( paramCtx ) );
90              }
91  
92              valueList.add( value );
93          }
94  
95          Object[] values = valueList.toArray( EMPTY_CLASS_ARRAY );
96          Object response = engine.invokeProcedure( session.getCoreSession(), procedure, values );
97          byte[] serializedResponse = SerializationUtils.serialize( ( Serializable ) response );
98          LdapApiService codec = session.getLdapServer().getDirectoryService().getLdapCodecService();
99          StoredProcedureFactory factory = ( StoredProcedureFactory ) codec.getExtendedResponseFactories().get( req.getRequestName() );
100         StoredProcedureResponse resp = ( StoredProcedureResponse ) factory.newResponse( serializedResponse );
101         resp.setMessageId( req.getMessageId() );
102         
103         session.getIoSession().write( resp );
104     }
105 
106 
107     /**
108      * {@inheritDoc}
109      */
110     @Override
111     public String getOid()
112     {
113         return StoredProcedureRequest.EXTENSION_OID;
114     }
115 
116     private static final Set<String> EXTENSION_OIDS;
117 
118     static
119     {
120         Set<String> s = new HashSet<>();
121         s.add( StoredProcedureRequest.EXTENSION_OID );
122         s.add( StoredProcedureResponse.EXTENSION_OID );
123         EXTENSION_OIDS = Collections.unmodifiableSet( s );
124     }
125 
126 
127     /**
128      * {@inheritDoc}
129      */
130     @Override
131     public Set<String> getExtensionOids()
132     {
133         return EXTENSION_OIDS;
134     }
135 
136 
137     /**
138      * {@inheritDoc}
139      */
140     @Override
141     public void setLdapServer( LdapServer ldapServer )
142     {
143     }
144 }