LdapStatesEnum.COMPARE_REQUEST_STATE, LdapStatesEnum.ENTRY_COMP_STATE, UniversalTag.OCTET_STRING.getValue(),
new GrammarAction<LdapMessageContainer<CompareRequestDecorator>>( "Store entry" )
{
public void action( LdapMessageContainer<CompareRequestDecorator> container ) throws DecoderException
{
CompareRequest compareRequest = container.getMessage();
// Get the Value and store it in the CompareRequest
TLV tlv = container.getCurrentTLV();
Dn entry = null;
// We have to handle the special case of a 0 length matched
// Dn
if ( tlv.getLength() == 0 )
{
// This will generate a PROTOCOL_ERROR
throw new DecoderException( I18n.err( I18n.ERR_04089 ) );
}
else
{
byte[] dnBytes = tlv.getValue().getData();
String dnStr = Strings.utf8ToString(dnBytes);
try
{
entry = new Dn( dnStr );
}
catch ( LdapInvalidDnException ine )
{
String msg = "Invalid Dn given : " + dnStr + " (" + Strings.dumpBytes(dnBytes)
+ ") is invalid";
LOG.error( "{} : {}", msg, ine.getMessage() );
CompareResponseImpl response = new CompareResponseImpl( compareRequest.getMessageId() );
throw new ResponseCarryingException( msg, response, ResultCodeEnum.INVALID_DN_SYNTAX,
Dn.EMPTY_DN, ine );
}
compareRequest.setName( entry );
}
if ( IS_DEBUG )
{
LOG.debug( "Comparing Dn {}", entry );
}
}
} );
// --------------------------------------------------------------------------------------------
// Transition from entryComp to ava
// --------------------------------------------------------------------------------------------
// CompareRequest ::= [APPLICATION 14] SEQUENCE {
// ...
// ava AttributeValueAssertion }
//
// AttributeValueAssertion ::= SEQUENCE {
//
// Nothing to do
super.transitions[LdapStatesEnum.ENTRY_COMP_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] = new GrammarTransition(
LdapStatesEnum.ENTRY_COMP_STATE, LdapStatesEnum.AVA_STATE, UniversalTag.SEQUENCE.getValue(), null );
// --------------------------------------------------------------------------------------------
// Transition from ava to AttributeDesc
// --------------------------------------------------------------------------------------------
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription,
// ...
//
// AttributeDescription LDAPString
//
// Stores the attribute description
super.transitions[LdapStatesEnum.AVA_STATE.ordinal()][UniversalTag.OCTET_STRING.getValue()] = new GrammarTransition(
LdapStatesEnum.AVA_STATE, LdapStatesEnum.ATTRIBUTE_DESC_STATE, UniversalTag.OCTET_STRING.getValue(),
new GrammarAction<LdapMessageContainer<CompareRequestDecorator>>( "Store attribute desc" )
{
public void action( LdapMessageContainer<CompareRequestDecorator> container ) throws DecoderException
{
// Get the CompareRequest Object
CompareRequest compareRequest = container.getMessage();
// Get the Value and store it in the CompareRequest
TLV tlv = container.getCurrentTLV();
// We have to handle the special case of a 0 length matched
// Dn
if ( tlv.getLength() == 0 )
{
String msg = I18n.err( I18n.ERR_04093 );
LOG.error( msg );
CompareResponseImpl response = new CompareResponseImpl( compareRequest.getMessageId() );
throw new ResponseCarryingException( msg, response, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX,
compareRequest.getName(), null );
}
String type = getType(tlv.getValue().getData());
compareRequest.setAttributeId( type );
if ( IS_DEBUG )
{
LOG.debug( "Comparing attribute description {}", compareRequest.getAttributeId() );
}
}
} );
// --------------------------------------------------------------------------------------------
// Transition from AttributeDesc to Assertion Value
// --------------------------------------------------------------------------------------------
// AttributeValueAssertion ::= SEQUENCE {
// ...
// assertionValue AssertionValue }
//
// AssertionValue OCTET STRING
//
// Stores the attribute value
super.transitions[LdapStatesEnum.ATTRIBUTE_DESC_STATE.ordinal()][UniversalTag.OCTET_STRING.getValue()] = new GrammarTransition(
LdapStatesEnum.ATTRIBUTE_DESC_STATE, LdapStatesEnum.ASSERTION_VALUE_STATE, UniversalTag.OCTET_STRING.getValue(),
new GrammarAction<LdapMessageContainer<CompareRequestDecorator>>( "Store assertion value" )
{
public void action( LdapMessageContainer<CompareRequestDecorator> container )
{
// Get the CompareRequest Object
CompareRequest compareRequest = container.getMessage();
// Get the Value and store it in the CompareRequest
TLV tlv = container.getCurrentTLV();
// We have to handle the special case of a 0 length value
if ( tlv.getLength() == 0 )
{
compareRequest.setAssertionValue( "" );
}
else
{
if ( container.isBinary( compareRequest.getAttributeId() ) )
{
compareRequest.setAssertionValue( tlv.getValue().getData() );
if ( IS_DEBUG )
{
LOG.debug( "Comparing attribute value {}", Strings.dumpBytes(compareRequest
.getAssertionValue().getBytes()) );
}
}
else
{
compareRequest.setAssertionValue( Strings.utf8ToString(tlv.getValue().getData()) );
if ( LOG.isDebugEnabled() )
{
LOG.debug( "Comparing attribute value {}", compareRequest.getAssertionValue() );
}
}
}
// We can have an END transition