Search in sources :

Example 1 with ExpressionAttribute

use of org.apache.commons.jelly.impl.ExpressionAttribute in project hudson-2.x by hudson.

the class MorphTagLibrary method createTagScript.

@Override
public TagScript createTagScript(final String tagName, Attributes attributes) throws JellyException {
    return new TagScript() {

        private Object evalAttribute(String name, JellyContext context) {
            ExpressionAttribute e = attributes.get(name);
            if (e == null)
                return null;
            return e.exp.evaluate(context);
        }

        private Collection<?> getExclusions(JellyContext context) {
            Object exclusion = evalAttribute(EXCEPT_ATTRIBUTES, context);
            if (exclusion == null)
                return Collections.emptySet();
            if (exclusion instanceof String)
                // split by whitespace
                return Arrays.asList(exclusion.toString().split("\\s+"));
            if (exclusion instanceof Collection)
                return (Collection) exclusion;
            throw new IllegalArgumentException("Expected collection for exclusion but found :" + exclusion);
        }

        @Override
        public void run(JellyContext context, XMLOutput output) throws JellyTagException {
            AttributesImpl actual = new AttributesImpl();
            Collection<?> exclusions = getExclusions(context);
            Map<String, ?> meta = (Map) evalAttribute(META_ATTRIBUTES, context);
            if (meta != null) {
                for (Map.Entry<String, ?> e : meta.entrySet()) {
                    String key = e.getKey();
                    // @see jelly.impl.DynamicTag.setAttribute() -- ${attrs} has duplicates with "Attr" suffix
                    if (key.endsWith("Attr") && meta.containsKey(key.substring(0, key.length() - 4)))
                        continue;
                    // @see http://github.com/hudson/jelly/commit/4ae67d15957b5b4d32751619997a3cb2a6ad56ed
                    if (key.equals("ownerTag"))
                        continue;
                    if (!exclusions.contains(key)) {
                        Object v = e.getValue();
                        if (v != null)
                            actual.addAttribute("", key, key, "CDATA", v.toString());
                    }
                }
            } else {
                meta = Collections.emptyMap();
            }
            for (Map.Entry<String, ExpressionAttribute> e : attributes.entrySet()) {
                String name = e.getKey();
                // already handled
                if (name.equals(META_ATTRIBUTES) || name.equals(EXCEPT_ATTRIBUTES))
                    continue;
                if (meta.containsKey(name)) {
                    // if the explicit value is also generated by a map, delete it first.
                    // this is O(N) operation, but we don't expect there to be a lot of collisions.
                    int idx = actual.getIndex(name);
                    if (idx >= 0)
                        actual.removeAttribute(idx);
                }
                Expression expression = e.getValue().exp;
                actual.addAttribute("", name, name, "CDATA", expression.evaluateAsString(context));
            }
            try {
                output.startElement(tagName, actual);
                getTagBody().run(context, output);
                output.endElement(tagName);
            } catch (SAXException x) {
                throw new JellyTagException(x);
            }
        }
    };
}
Also used : JellyTagException(org.apache.commons.jelly.JellyTagException) XMLOutput(org.apache.commons.jelly.XMLOutput) SAXException(org.xml.sax.SAXException) AttributesImpl(org.xml.sax.helpers.AttributesImpl) ExpressionAttribute(org.apache.commons.jelly.impl.ExpressionAttribute) Expression(org.apache.commons.jelly.expression.Expression) TagScript(org.apache.commons.jelly.impl.TagScript) Collection(java.util.Collection) JellyContext(org.apache.commons.jelly.JellyContext) Map(java.util.Map)

Aggregations

Collection (java.util.Collection)1 Map (java.util.Map)1 JellyContext (org.apache.commons.jelly.JellyContext)1 JellyTagException (org.apache.commons.jelly.JellyTagException)1 XMLOutput (org.apache.commons.jelly.XMLOutput)1 Expression (org.apache.commons.jelly.expression.Expression)1 ExpressionAttribute (org.apache.commons.jelly.impl.ExpressionAttribute)1 TagScript (org.apache.commons.jelly.impl.TagScript)1 SAXException (org.xml.sax.SAXException)1 AttributesImpl (org.xml.sax.helpers.AttributesImpl)1