1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
59
60
61
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
73 StoredProcEngineConfig javaSPEngineConfig = new JavaStoredProcEngineConfig();
74 List<StoredProcEngineConfig> spEngineConfigs = new ArrayList<StoredProcEngineConfig>();
75
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 }