view flys-client/src/main/java/org/dive4elements/river/client/server/features/XMLFileFeatures.java @ 5835:821a02bbfb4e

Fixed internal java dependencies
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 25 Apr 2013 13:12:15 +0200
parents f507086aa94b
children
line wrap: on
line source
package org.dive4elements.river.client.server.features;

import java.io.FileInputStream;
import java.io.IOException;

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

import javax.xml.xpath.XPathConstants;

import org.apache.log4j.Logger;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import org.dive4elements.artifacts.common.utils.XMLUtils;

public class XMLFileFeatures implements Features {

    private static final Logger logger =
        Logger.getLogger(XMLFileFeatures.class);

    private Map<String, List<String>> featuremap =
        new HashMap<String, List<String>>();

    private final static String XPATH_FEATURES = "ftr:feature/child::text()";
    private final static String XPATH_ROLES    = "/ftr:features/ftr:role";

    public XMLFileFeatures(String filename) throws IOException {
        FileInputStream finput = new FileInputStream(filename);
        logger.debug("XMLFileFeatures: " + filename);
        try {
            Document doc = XMLUtils.parseDocument(finput);

            NodeList roles = (NodeList) XMLUtils.xpath(
                doc,
                XPATH_ROLES,
                XPathConstants.NODESET,
                FeaturesNamespaceContext.INSTANCE);

            for(int i = 0, m = roles.getLength(); i < m; i++) {
                Element rolenode = (Element)roles.item(i);

                String name = rolenode.getAttribute("name");

                logger.debug("Found role: " + name);

                NodeList features = (NodeList) XMLUtils.xpath(
                    rolenode,
                    XPATH_FEATURES,
                    XPathConstants.NODESET,
                    FeaturesNamespaceContext.INSTANCE);

                if (features == null) {
                    continue;
                }

                int N = features.getLength();

                if (N > 0) {
                    List<String> allowed = new ArrayList<String>(N);
                    for (int j = 0; j < N; j++) {
                        Node featurenode = features.item(j);
                        String featurename = featurenode.getNodeValue();

                        logger.debug("Found feature: " + featurename);

                        allowed.add(featurename);
                    }
                    featuremap.put(name, allowed);
                }
            }
            logger.debug("Loaded all features");
        }
        finally {
            finput.close();
        }
    }

    @Override
    public List<String> getFeatures(List<String> roles) {
        List<String> features = new ArrayList<String>();

        for (String role: roles) {
            List<String> allowed = this.featuremap.get(role);
            if (allowed != null) {
                features.addAll(allowed);
            }
        }
        return features;
    }
}

http://dive4elements.wald.intevation.org