One more step !
Yesterday evening, I as able to work on the DeepTrimToLowerNormalizer
class, which is used to deal with the caseIgnoreMatch MatchingRule (the
most crequent Matching Rule), and I discovered that the java
Normalizer.normalize() method was already handling the combining
characters, which is otherwise a nightmare to handle (well, not that
much, but still). That will simplify the insignificantSpaceHandling
process a LOT.
Here is what will look like the DeepTrimToLowerNormalizer.normalize(
Value ) method :
public Value normalize( Value value, PrepareString.AssertionType
assertionType ) throws LdapException
{
if ( value == null )
{
return null;
}
try
{
// Transcoding
String transcoded = PrepareString.transcode( value.getBytes() );
// Map
String mapped = PrepareString.map( value,
PrepareString.IGNORE_CASE );
// Normalize
String normalized = PrepareString.normalize( mapped );
// Prohibit
PrepareString.checkProhibited( normalized );
// Bidi is ignored
// Insignificant Characters Handling
String normValue = PrepareString.insignificantSpaceHandling(
normalized, assertionType );
return new Value( value.getAttributeType(),
value.getValue(), normalized );
}
catch ( IOException ioe )
{
throw new LdapInvalidAttributeValueException(
ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX, I18n.err(
I18n.ERR_04224, value ), ioe );
}
}
Note that this method work only for Values or non-substrings assertions
(ie, assertions used in a filter that is not a SubstringFilter). For
substrings assertions (Initial, Any or Final, like the strings in a
filter '(cn=test*abc*end)'), we have to add a new parameter to the
normalize method. I'll deal with that later.
As you can see, this is all but simple... Making my way through the
jungle though ;-)
But first, a day job !