commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Henri Biestro (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (JEXL-162) empty() function throws an exception : unsupported type
Date Sat, 11 Jul 2015 10:32:04 GMT

    [ https://issues.apache.org/jira/browse/JEXL-162?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14623341#comment-14623341
] 

Henri Biestro commented on JEXL-162:
------------------------------------

The documented behavior is not what you expect.
It actually states : Returns *true* if the expression following is either...
The rationale is that 'emptiness' must have a meaning for the object considered, a callable
method implementation.
I agree though that a _lenient_ arithmetic should return 'false' (and 'size' should return
0) rather than generate an error.

You can implement your behavior by subclassing JexlArithmetic and overload the 'empty' method
as in the following where an 'empty' node is a node without attributes nor children.
{code}

    public static class XmlArithmetic extends JexlArithmetic {
        public XmlArithmetic(boolean lenient) {
            super(lenient);
        }
        public boolean empty(org.w3c.dom.Element elt) {
            return !elt.hasAttributes() && !elt.hasChildNodes();
        }
    }

    @Test
    public void test162() throws Exception {
        JexlEngine jexl = new JexlBuilder().arithmetic(new XmlArithmetic(false)).create();
        JexlScript s0 = jexl.createScript("empty(x)", "x");
        Document xml;
        Node x;
        Boolean r;
        xml = getDocument("<node info='123'/>");
        x = xml.getLastChild();
        r = (Boolean) s0.execute(null, x);
        Assert.assertFalse(r);
        xml = getDocument("<node>some content</node>");
        x = xml.getLastChild();
        r = (Boolean) s0.execute(null, x);
        Assert.assertFalse(r);
        xml = getDocument("<node/>");
        x = xml.getLastChild();
        r = (Boolean) s0.execute(null, x);
        Assert.assertTrue(r);
    }
        
    private static Document getDocument(String xml) throws IOException, SAXException, ParserConfigurationException
{
        DocumentBuilder xmlBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        InputStream stringInputStream = new ByteArrayInputStream(xml.getBytes("UTF-8"));
        return xmlBuilder.parse(stringInputStream);
    }
{code}

> empty() function throws an exception : unsupported type
> -------------------------------------------------------
>
>                 Key: JEXL-162
>                 URL: https://issues.apache.org/jira/browse/JEXL-162
>             Project: Commons JEXL
>          Issue Type: Bug
>    Affects Versions: 3.0
>            Reporter: Dmitri Blinov
>
> empty() : unsupported type : class com.sun.org.apache.xerces.internal.dom.ElementImpl.
> Exepected behaviour - just return false if neither:
>     Object is null
>     Object is an empty string
>     Object is an array of length zero
>     Object is a collection of size zero
>     Object is an empty map
> .....



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message