private void toDsml()

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 );
            }
        }
    }