velocity-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Claude Brisson (JIRA)" <...@velocity.apache.org>
Subject [jira] Issue Comment Edited: (VELOCITY-749) ReferenceInsertionEventHandler called "to often"/need more configuration settings
Date Thu, 17 Dec 2009 12:24:18 GMT

    [ https://issues.apache.org/jira/browse/VELOCITY-749?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12791897#action_12791897
] 

Claude Brisson edited comment on VELOCITY-749 at 12/17/09 12:22 PM:
--------------------------------------------------------------------

It's too complex to try to configure it, because the frontier between an internal and a real
output insertion is very difficult to define.

If you want to control precisely when escaping occurs and when it doesn't, you better inherit
EscapeXmlReference in a class of yours.

A quite handy way of handling this, that I often use, is giving prefixes to reference names.
For instance, you can have a filter that only escapes references whose name begins by 'xml'.

public class MyXmlEscape extends EscapeXmlReference
{
    public Object referenceInsert( String reference, Object value  ) {
        if (value == null)
        {
            return null;
        }
        if (!value instanceof String || !reference.startsWith("xml"))
        {
            // do not escape
            return value;
        }
        else
        {
            // escape
            return super.referenceInsert(reference, value);
        }
    }
}

That way, you can write :

#set( $test = 'Me & Co. Ltd' )
#set( $xmltest = " * $test * ")
$xmltest

and this will exhibit the expected behaviour.


      was (Author: claude):
    It's too complex to try to configure it, because the frontier between an internal and
a real output insertion is very difficult.

If you want to control precisely when escaping occurs and when it doesn't, you better inherit
EscapeXmlReference in a class of yours.

A quite handy way of handling this, that I often use, is giving prefixes to reference names.
For instance, you can have a filter that only escapes references whose name begins by 'xml'.

public class MyXmlEscape extends EscapeXmlReference
{
    public Object referenceInsert( String reference, Object value  ) {
        if (value == null)
        {
            return null;
        }
        if (!value instanceof String || !reference.startsWith("xml"))
        {
            // do not escape
            return value;
        }
        else
        {
            // escape
            return super.referenceInsert(reference, value);
        }
    }
}

That way, you can write :

#set( $test = 'Me & Co. Ltd' )
#set( $xmltest = " * $test * ")
$xmltest

and this will exhibit the expected behaviour.

  
> ReferenceInsertionEventHandler called "to often"/need more configuration settings
> ---------------------------------------------------------------------------------
>
>                 Key: VELOCITY-749
>                 URL: https://issues.apache.org/jira/browse/VELOCITY-749
>             Project: Velocity
>          Issue Type: Bug
>    Affects Versions: 1.6.2
>            Reporter: Marco Rothe
>            Priority: Minor
>             Fix For: 1.6.x, 1.7
>
>
> I use the EscapeXmlReference (ReferenceInsertionEventHandler implementation) in our projects
to produce valid XHTML.
> But I works not as expected in some situations:
> Given the reference $test as 'Me & Co. Ltd' (for example from context) will output
as 
> Me &amp; Co. Ltd 
> correctly after the EscapeXmlReference.
> But if we enrich the $test reference with some other string before output (#set($test
= "* $test *")) we got 
> * Me &amp;amp; Co. Ltd *  
> and not  * Me &amp; Co. Ltd * as output!
> This is because the EscapeReference handler was called two times. First on the (internal)
set directive (Me & Co. Ltd -> Me &amp; Co. Ltd), second on the real output of
$test to the stream (* Me &amp; Co. Ltd *->  * Me &amp;amp; Co. Ltd *). 
> The javadoc of ReferenceInsertionEventHandler says "Reference 'Stream insertion' event
handler.  Called with object  that will be inserted into stream via value.toString()." 
> "inserted  into stream" means to me  into the real output stream of the template merge,
not into internal substreams. So I believe it's a bug or a least an unexpected behaviour because
it produce unpredictable results on string operations.
> So the ReferenceInsertionEventHandler needs the possibility to know if the current insertation
is an internal or an real output insertation to be able to react on situations as descripted
above.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@velocity.apache.org
For additional commands, e-mail: dev-help@velocity.apache.org


Mime
View raw message