On 08/10/2015 06:15 PM, Emmanuel Lécharny wrote:
No magic needed here (although some magic might come very useful with
some LDAP servers :-) ) .... I just expect that when no
X-NOT-HUMAN-READABLE is present then the default from the RFC is used.
Isn't that a reasonable expectation?
No, sadly.

I still do not see why is that a problem. Default value based on RFC seems to be much more reasonable than plain "true". Especially if it will work with both ApacheDS and at least two other servers - out of the box.

I can do it ... I only need a blessing.

But anyway, if the answer is still "no" then I can cope with it. I just would like to express slight disappointment. I hoped that the ambition of Apache Directory API is a broad interoperability and not just interoperability with a single directory server.

It's more complex.

Values is stored in two forms :
- binary
- String

except that binary values are not stored in String form.

Are you sure?

StringValue.getBytes() returns field bytes (byte[]).
StringValue.getString() returns field wrappedValue (String).

So it looks like both values are stored now (at least in the memory - but that is what matters for the API).

When we receive a new value for a H-R attribute, we receive it on the
server as an UTF-8 byte[], and we convert it immediately to a String.

Yes. And this still can happen. Just store the original byte[] as it was received.

If I understand the code correctly then the current code (StringValue.readExternal(...)) converts the value from stream to UTF8 (wrappedValue = in.readUTF()) and then immediately converts it back (bytes = Strings.getBytesUtf8( wrappedValue )). Which means two conversions instead of one. But there is even worse aspect. The content of "bytes" may not be the same as the value that was originally received. This is really really bad for diagnostics (at the very least) because it is in fact lying.

for the on going processing, up to the point we store the data into the
backend, we always use the String representation, because this is how we
do comparison and normalization. When we store the data in the backend,
in order to save the String Preparation processing which is already
over-expensive (http://tools.ietf.org/search/rfc4518

And this can still happen. Just modify StringValue.readExternal(...) to store the original value to "bytes" and then convert it to "wrappedValue". You will save one conversion and you will have more robust and predictable system.

Switching to a byte[] for everything *in the server* would force us to
rewrite all the syntax checkers/comparions/normalizers to work with
UTF-8, whoich would be a major burden.

If the server is using StringValue then you will not need to change anything. Interface will remain the same and behavior compatible (if you do not think about "comaptible bugs" of course).

Life is complicated...

Maybe not that much :-)


--
Radovan Semancik
Software Architect
evolveum.com

Reply via email to