diff flys-client/src/main/java/org/dive4elements/river/client/server/features/XMLFileFeatures.java @ 5834:f507086aa94b

Repaired internal references.
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 25 Apr 2013 12:31:32 +0200
parents flys-client/src/main/java/de/intevation/flys/client/server/features/XMLFileFeatures.java@02cf2b1dff84
children 821a02bbfb4e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-client/src/main/java/org/dive4elements/river/client/server/features/XMLFileFeatures.java	Thu Apr 25 12:31:32 2013 +0200
@@ -0,0 +1,96 @@
+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);
+        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