view flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/FunctionResolver.java @ 4496:d8992459b408

Add method to return the facets of an artifact This methos should be used to get the facets of an artifact instead of accessing the facets member variable directly.
author Björn Ricks <bjoern.ricks@intevation.de>
date Wed, 14 Nov 2012 11:11:04 +0100
parents de0c2bbb27f9
children 2970046fcdca
line wrap: on
line source
package de.intevation.flys.artifacts.datacage.templating;

import java.util.List;
import java.util.Collection;
import java.util.Map;
import java.util.ArrayList;

import javax.xml.xpath.XPathFunctionResolver;
import javax.xml.xpath.XPathFunction;
import javax.xml.xpath.XPathFunctionException;

import javax.xml.namespace.QName;

import org.apache.log4j.Logger;

public class FunctionResolver
implements   XPathFunctionResolver
{
    private static Logger log = Logger.getLogger(FunctionResolver.class);

    public static final String FUNCTION_NAMESPACE_URI = "dc";

    public static final class Entry {

        String        name;
        XPathFunction function;
        int           arity;

        public Entry() {
        }

        public Entry(String name, XPathFunction function, int arity) {
            this.name     = name;
            this.function = function;
            this.arity    = arity;
        }
    } // class Entry

    public static final FunctionResolver FUNCTIONS = new FunctionResolver();

    static {
        /** Implementation of case-ignoring dc:contains. */
        FUNCTIONS.addFunction("contains", 2, new XPathFunction() {
            @Override
            public Object evaluate(List args) throws XPathFunctionException {
                Object haystack = args.get(0);
                Object needle   = args.get(1);

                if (needle instanceof String) {
                    needle = ((String)needle).toUpperCase();
                }

                try {
                    if (haystack instanceof Collection) {
                        return Boolean.valueOf(
                            ((Collection)haystack).contains(needle));
                    }

                    if (haystack instanceof Map) {
                        return Boolean.valueOf(
                            ((Map)haystack).containsKey(needle));
                    }

                    if (haystack instanceof Object []) {
                        for (Object straw: (Object [])haystack) {
                            if (straw.equals(needle)) {
                                return Boolean.TRUE;
                            }
                        }
                    }

                    return Boolean.FALSE;
                }
                catch (Exception e) {
                    log.error(e);
                    throw new XPathFunctionException(e);
                }
            }
        });
    }

    protected List<Entry> functions;

    public FunctionResolver() {
        functions = new ArrayList<Entry>();
    }

    public void addFunction(String name, int arity, XPathFunction function) {
        functions.add(new Entry(name, function, arity));
    }

    @Override
    public XPathFunction resolveFunction(QName functionName, int arity) {

        if (!functionName.getNamespaceURI().equals(FUNCTION_NAMESPACE_URI)) {
            return null;
        }

        String name = functionName.getLocalPart();
        for (Entry entry: functions) {
            if (entry.arity == arity && entry.name.equals(name)) {
                return entry.function;
            }
        }

        return null;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org