in dsml/parser/src/main/java/org/apache/directory/api/dsmlv2/request/SearchRequestDsml.java [462:624]
private void toDsml( Element element, ExprNode filter )
{
// AND FILTER
if ( filter instanceof AndNode )
{
Element newElement = element.addElement( DsmlLiterals.AND );
List<ExprNode> filterList = ( ( AndNode ) filter ).getChildren();
for ( int i = 0; i < filterList.size(); i++ )
{
toDsml( newElement, filterList.get( i ) );
}
}
// OR FILTER
else if ( filter instanceof OrNode )
{
Element newElement = element.addElement( DsmlLiterals.OR );
List<ExprNode> filterList = ( ( OrNode ) filter ).getChildren();
for ( int i = 0; i < filterList.size(); i++ )
{
toDsml( newElement, filterList.get( i ) );
}
}
// NOT FILTER
else if ( filter instanceof NotNode )
{
Element newElement = element.addElement( DsmlLiterals.NOT );
toDsml( newElement, ( ( NotNode ) filter ).getFirstChild() );
}
// SUBSTRING FILTER
else if ( filter instanceof SubstringNode )
{
Element newElement = element.addElement( DsmlLiterals.SUBSTRINGS );
SubstringNode substringFilter = ( SubstringNode ) filter;
newElement.addAttribute( DsmlLiterals.NAME, substringFilter.getAttribute() );
String initial = substringFilter.getInitial();
if ( Strings.isNotEmpty( initial ) )
{
newElement.addElement( DsmlLiterals.INITIAL ).setText( initial );
}
List<String> anyList = substringFilter.getAny();
for ( int i = 0; i < anyList.size(); i++ )
{
newElement.addElement( DsmlLiterals.ANY ).setText( anyList.get( i ) );
}
String finalString = substringFilter.getFinal();
if ( Strings.isNotEmpty( finalString ) )
{
newElement.addElement( DsmlLiterals.FINAL ).setText( finalString );
}
}
// APPROXMATCH, EQUALITYMATCH, GREATEROREQUALS & LESSOREQUAL FILTERS
else if ( filter instanceof SimpleNode )
{
Element newElement;
if ( filter instanceof ApproximateNode )
{
newElement = element.addElement( DsmlLiterals.APPROX_MATCH );
}
else if ( filter instanceof EqualityNode )
{
newElement = element.addElement( DsmlLiterals.EQUALITY_MATCH );
}
else if ( filter instanceof GreaterEqNode )
{
newElement = element.addElement( DsmlLiterals.GREATER_OR_EQUAL );
}
else
// it is a LessEqNode )
{
newElement = element.addElement( DsmlLiterals.LESS_OR_EQUAL );
}
String attributeName = ( ( SimpleNode<?> ) filter ).getAttribute();
newElement.addAttribute( DsmlLiterals.NAME, attributeName );
Value value = ( ( SimpleNode<?> ) filter ).getValue();
if ( value != null )
{
if ( value.isHumanReadable() )
{
newElement.addElement( DsmlLiterals.VALUE ).setText( StringEscapeUtils.escapeXml11( value.getString() ) );
}
else
{
Namespace xsdNamespace = new Namespace( ParserUtils.XSD, ParserUtils.XML_SCHEMA_URI );
Namespace xsiNamespace = new Namespace( ParserUtils.XSI, ParserUtils.XML_SCHEMA_INSTANCE_URI );
element.getDocument().getRootElement().add( xsdNamespace );
element.getDocument().getRootElement().add( xsiNamespace );
Element valueElement = newElement.addElement( DsmlLiterals.VALUE ).addText(
ParserUtils.base64Encode( value ) );
valueElement
.addAttribute( new QName( DsmlLiterals.TYPE, xsiNamespace ), ParserUtils.XSD_COLON + ParserUtils.BASE64BINARY );
}
}
}
// PRESENT FILTER
else if ( filter instanceof PresenceNode )
{
Element newElement = element.addElement( DsmlLiterals.PRESENT );
newElement.addAttribute( DsmlLiterals.NAME, ( ( PresenceNode ) filter ).getAttribute() );
}
// EXTENSIBLEMATCH
else if ( filter instanceof ExtensibleNode )
{
Element newElement = element.addElement( DsmlLiterals.EXTENSIBLE_MATCH );
Value value = ( ( ExtensibleNode ) filter ).getValue();
if ( value != null )
{
if ( ParserUtils.needsBase64Encoding( value ) )
{
Namespace xsdNamespace = new Namespace( ParserUtils.XSD, ParserUtils.XML_SCHEMA_URI );
Namespace xsiNamespace = new Namespace( ParserUtils.XSI, ParserUtils.XML_SCHEMA_INSTANCE_URI );
element.getDocument().getRootElement().add( xsdNamespace );
element.getDocument().getRootElement().add( xsiNamespace );
Element valueElement = newElement.addElement( DsmlLiterals.VALUE ).addText(
ParserUtils.base64Encode( value.getString() ) );
valueElement.addAttribute( new QName( DsmlLiterals.TYPE, xsiNamespace ), ParserUtils.XSD_COLON + ParserUtils.BASE64BINARY );
}
else
{
newElement.addElement( DsmlLiterals.VALUE ).setText( value.getString() );
}
}
if ( ( ( ExtensibleNode ) filter ).hasDnAttributes() )
{
newElement.addAttribute( DsmlLiterals.DN_ATTRIBUTES, DsmlLiterals.TRUE );
}
String matchingRule = ( ( ExtensibleNode ) filter ).getMatchingRuleId();
if ( Strings.isNotEmpty( matchingRule ) )
{
newElement.addAttribute( DsmlLiterals.MATCHING_RULE, matchingRule );
}
}
}