package com.hwlcn.ldap.ldap.matchingrules;
import com.hwlcn.ldap.asn1.ASN1OctetString;
import com.hwlcn.ldap.ldap.sdk.LDAPException;
import com.hwlcn.core.annotation.Extensible;
import com.hwlcn.core.annotation.ThreadSafety;
import com.hwlcn.ldap.util.ThreadSafetyLevel;
@Extensible()
@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
public abstract class SimpleMatchingRule
extends MatchingRule
{
private static final long serialVersionUID = -7221506185552250694L;
@Override()
public boolean valuesMatch(final ASN1OctetString value1,
final ASN1OctetString value2)
throws LDAPException
{
return normalize(value1).equals(normalize(value2));
}
@Override()
public boolean matchesSubstring(final ASN1OctetString value,
final ASN1OctetString subInitial,
final ASN1OctetString[] subAny,
final ASN1OctetString subFinal)
throws LDAPException
{
final byte[] normValue = normalize(value).getValue();
int pos = 0;
if (subInitial != null)
{
final byte[] normSubInitial =
normalizeSubstring(subInitial, SUBSTRING_TYPE_SUBINITIAL).getValue();
if (normValue.length < normSubInitial.length)
{
return false;
}
for (int i=0; i < normSubInitial.length; i++)
{
if (normValue[i] != normSubInitial[i])
{
return false;
}
}
pos = normSubInitial.length;
}
if (subAny != null)
{
final byte[][] normSubAny = new byte[subAny.length][];
for (int i=0; i < subAny.length; i++)
{
normSubAny[i] =
normalizeSubstring(subAny[i],SUBSTRING_TYPE_SUBANY).getValue();
}
for (final byte[] b : normSubAny)
{
if (b.length == 0)
{
continue;
}
boolean match = false;
final int subEndLength = normValue.length - b.length;
while (pos <= subEndLength)
{
match = true;
for (int i=0; i < b.length; i++)
{
if (normValue[pos+i] != b[i])
{
match = false;
break;
}
}
if (match)
{
pos += b.length;
break;
}
else
{
pos++;
}
}
if (! match)
{
return false;
}
}
}
if (subFinal != null)
{
final byte[] normSubFinal =
normalizeSubstring(subFinal, SUBSTRING_TYPE_SUBFINAL).getValue();
int finalStartPos = normValue.length - normSubFinal.length;
if (finalStartPos < pos)
{
return false;
}
for (int i=0; i < normSubFinal.length; i++,finalStartPos++)
{
if (normValue[finalStartPos] != normSubFinal[i])
{
return false;
}
}
}
return true;
}
@Override()
public int compareValues(final ASN1OctetString value1,
final ASN1OctetString value2)
throws LDAPException
{
final byte[] normValue1 = normalize(value1).getValue();
final byte[] normValue2 = normalize(value2).getValue();
final int minLength = Math.min(normValue1.length, normValue2.length);
for (int i=0; i < minLength; i++)
{
final int b1 = normValue1[i] & 0xFF;
final int b2 = normValue2[i] & 0xFF;
if (b1 < b2)
{
return -1;
}
else if (b1 > b2)
{
return 1;
}
}
return normValue1.length - normValue2.length;
}
}