Mercurial > dive4elements > river
diff gwt-client/src/main/java/org/dive4elements/river/client/server/features/XMLFileFeatures.java @ 5838:5aa05a7a34b7
Rename modules to more fitting names.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 15:23:37 +0200 |
parents | flys-client/src/main/java/org/dive4elements/river/client/server/features/XMLFileFeatures.java@821a02bbfb4e |
children | 172338b1407f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/features/XMLFileFeatures.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,96 @@ +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; + } +}