1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
49
50
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
63 StoredProcEngineConfig javaSPEngineConfig = new JavaStoredProcEngineConfig();
64 List<StoredProcEngineConfig> spEngineConfigs = new ArrayList<>();
65
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
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
129
130 @Override
131 public Set<String> getExtensionOids()
132 {
133 return EXTENSION_OIDS;
134 }
135
136
137
138
139
140 @Override
141 public void setLdapServer( LdapServer ldapServer )
142 {
143 }
144 }