Ah ! I think I see what's wrong you are trying to send a DSML message using a LdapNetwork connection. That will simply don't work because a DSML request is not intended to be sent through a LDP connection, but through a http connection.
Le 27/01/2017 à 19:13, [email protected] a écrit : > Thanks for the fix. > > As I wrote initially I had already tried with registering the two > factories and got a ClassCastException. > I tried now with RC3 but as suspected I still get the same > ClassCastException: > > java.lang.ClassCastException: > org.apache.directory.api.dsmlv2.DsmlControl cannot be cast to > org.apache.directory.api.ldap.model.message.controls.SortRequest > org.apache.mina.filter.codec.ProtocolEncoderException: > java.lang.ClassCastException: > org.apache.directory.api.dsmlv2.DsmlControl cannot be cast to > org.apache.directory.api.ldap.model.message.controls.SortRequest > at > org.apache.mina.filter.codec.ProtocolCodecFilter.filterWrite(ProtocolCodecFilter.java:330) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:629) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:48) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:957) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.filterWrite(DefaultIoFilterChain.java:881) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:629) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.fireFilterWrite(DefaultIoFilterChain.java:622) > at > org.apache.mina.core.session.AbstractIoSession.write(AbstractIoSession.java:574) > at > org.apache.mina.core.session.AbstractIoSession.write(AbstractIoSession.java:519) > at > org.apache.directory.ldap.client.api.LdapNetworkConnection.writeRequest(LdapNetworkConnection.java:4244)[88:org.apache.directory.api.ldap.client.api:1.0.0.RC3-SNAPSHOT] > at > org.apache.directory.ldap.client.api.LdapNetworkConnection.searchAsync(LdapNetworkConnection.java:1838)[88:org.apache.directory.api.ldap.client.api:1.0.0.RC3-SNAPSHOT] > at > org.apache.directory.ldap.client.api.LdapNetworkConnection.search(LdapNetworkConnection.java:1865)[88:org.apache.directory.api.ldap.client.api:1.0.0.RC3-SNAPSHOT] > > ... > > Caused by: java.lang.ClassCastException: > org.apache.directory.api.dsmlv2.DsmlControl cannot be cast to > org.apache.directory.api.ldap.model.message.controls.SortRequest > at > org.apache.directory.api.ldap.codec.controls.sort.SortRequestFactory.newCodecControl(SortRequestFactory.java:35) > at > org.apache.directory.api.ldap.codec.osgi.DefaultLdapCodecService.newControl(DefaultLdapCodecService.java:275) > at > org.apache.directory.api.ldap.codec.api.MessageDecorator.addControl(MessageDecorator.java:340)[89:org.apache.directory.api.ldap.codec.core:1.0.0.RC3-SNAPSHOT] > at > org.apache.directory.api.ldap.codec.decorators.SearchRequestDecorator.addControl(SearchRequestDecorator.java:1118) > at > org.apache.directory.api.ldap.codec.decorators.SearchRequestDecorator.addControl(SearchRequestDecorator.java:83) > at > org.apache.directory.api.ldap.codec.api.MessageDecorator.getDecorator(MessageDecorator.java:225)[89:org.apache.directory.api.ldap.codec.core:1.0.0.RC3-SNAPSHOT] > at > org.apache.directory.api.ldap.codec.api.LdapEncoder.encodeMessage(LdapEncoder.java:159)[89:org.apache.directory.api.ldap.codec.core:1.0.0.RC3-SNAPSHOT] > at > org.apache.directory.api.ldap.codec.protocol.mina.LdapProtocolEncoder.encode(LdapProtocolEncoder.java:82) > at > org.apache.mina.filter.codec.ProtocolCodecFilter.filterWrite(ProtocolCodecFilter.java:299) > > I have the feeling that some link between DSML and codec is missing > for the (sort) control... > > On 27/01/17 15:38, Emmanuel Lécharny wrote: >> I have committed a fix for this problem. Yu might want to rebuild the >> API and test it. >> >> >> Le 27/01/2017 à 13:16, [email protected] a écrit : >>> Hi, >>> >>> I have an application running in an OSGi container that uses the LDAP >>> API and DSML parser and I would like to use the server side sorting >>> control. >>> >>> When I send the following control... >>> >>> <ns2:control criticality="true" type="1.2.840.113556.1.4.473"> >>> <ns2:controlValue >>> xmlns:xs="http://www.w3.org/2001/XMLSchema" >>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >>> xsi:type="xs:base64Binary">MAYwBAQCc24=</ns2:controlValue> >>> </ns2:control> >>> >>> ...I get an error: "sorted results control value is absent". >>> >>> 2017-01-27 12:19:37,304 | DEBUG | NioProcessor-1 | >>> CODEC_LOG | 94 - >>> org.apache.directory.api.ldap.net.mina - 1.0.0.RC2 | Decoded >>> LdapMessage : MessageType : SEARCH_RESULT_DONE >>> Message ID : 4 >>> Search Result Done >>> Ldap Result >>> Result code : (PROTOCOL_ERROR) protocolError >>> Matched Dn : '' >>> Diagnostic message : 'sorted results control value is >>> absent' >>> >>> I saw that an OpaqueControl is created for the sort control. Debugging >>> I noticed that setEncodedValue is never called. >>> >>> org.apache.directory.api.ldap.model.message.SearchRequestImpl@7ea4768c >>> OpaqueControl Control >>> Type OID : '1.2.840.113556.1.4.473' >>> Criticality : 'true' >>> >>> Looking into this I came across the control factories registered on >>> LdapApiService and saw that there are two implementations: >>> - DefaultLdapCodecService >>> - StandaloneLdapApiService >>> >>> DefaultLdapCodecService is what is initialized in OSGi setup. I >>> noticed that DefaultLdapCodecService unlike StandaloneLdapApiService >>> does not register SortRequestFactory/SortResponseFactory. To try if >>> this solves the issue I registered the two factories but then I get a >>> ClassCastException: >>> >>> Caused by: java.lang.ClassCastException: >>> org.apache.directory.api.dsmlv2.DsmlControl cannot be cast to >>> org.apache.directory.api.ldap.model.message.controls.SortRequest >>> at >>> org.apache.directory.api.ldap.codec.controls.sort.SortRequestFactory.newCodecControl(SortRequestFactory.java:35)[89:org.apache.directory.api.ldap.codec.core:1.0.0.RC2] >>> >>> at >>> org.apache.directory.api.ldap.codec.osgi.DefaultLdapCodecService.newControl(DefaultLdapCodecService.java:253) >>> >>> at >>> org.apache.directory.api.ldap.codec.api.MessageDecorator.addControl(MessageDecorator.java:329)[89:org.apache.directory.api.ldap.codec.core:1.0.0.RC2] >>> >>> at >>> org.apache.directory.api.ldap.codec.decorators.SearchRequestDecorator.addControl(SearchRequestDecorator.java:1072) >>> >>> at >>> org.apache.directory.api.ldap.codec.decorators.SearchRequestDecorator.addControl(SearchRequestDecorator.java:83) >>> >>> at >>> org.apache.directory.api.ldap.codec.api.MessageDecorator.getDecorator(MessageDecorator.java:204)[89:org.apache.directory.api.ldap.codec.core:1.0.0.RC2] >>> >>> at >>> org.apache.directory.api.ldap.codec.api.LdapEncoder.encodeMessage(LdapEncoder.java:159)[89:org.apache.directory.api.ldap.codec.core:1.0.0.RC2] >>> >>> at >>> org.apache.directory.api.ldap.codec.protocol.mina.LdapProtocolEncoder.encode(LdapProtocolEncoder.java:81) >>> >>> at >>> org.apache.mina.filter.codec.ProtocolCodecFilter.filterWrite(ProtocolCodecFilter.java:299) >>> >>> ... 58 more >>> >>> I do not understand how the DSMLv2 parser works together with the LDAP >>> codec and start to wonder if the server side sort control is even >>> supposed to work at the moment. >>> - Is it possible that the parser for DSMLv2 does not support the >>> server side sort control? >>> - Should SortRequestFactory/SortResponseFactory be registered or is >>> there a reason why they are not registered on DefaultLdapCodecService >>> per default? >>> >>> I would appreciate any hints to get this working. >>> >>> Cheers >>> Claudia >>> > -- Emmanuel Lecharny Symas.com directory.apache.org
