view flys-client/src/main/java/de/intevation/flys/client/server/features/XMLFileFeatures.java @ 4284:7a94d5e7fc3d

Write the "hidden" attribute of a style into the collection's attribute when using the theme editor. Otherwise, the next time using the theme editor, the hidden attributes that should not be changed by the user are visible.
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Mon, 29 Oct 2012 07:18:42 +0100
parents 5f628a13ca9f
children 02cf2b1dff84
line wrap: on
line source
package de.intevation.flys.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 de.intevation.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);

        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