bjoern@3476: package de.intevation.flys.client.server.features; bjoern@3476: bjoern@3476: import java.io.FileInputStream; bjoern@3476: import java.io.IOException; bjoern@3476: bjoern@3482: import java.util.ArrayList; sascha@3484: import java.util.HashMap; bjoern@3476: import java.util.List; sascha@3484: import java.util.Map; bjoern@3476: bjoern@3476: import javax.xml.xpath.XPathConstants; bjoern@3476: bjoern@3476: import org.apache.log4j.Logger; bjoern@3476: bjoern@3476: import org.w3c.dom.Document; bjoern@3476: import org.w3c.dom.Element; bjoern@3476: import org.w3c.dom.Node; bjoern@3476: import org.w3c.dom.NodeList; bjoern@3476: bjoern@3476: import de.intevation.artifacts.common.utils.XMLUtils; bjoern@3476: bjoern@3476: public class XMLFileFeatures implements Features { bjoern@3476: sascha@3484: private static final Logger logger = sascha@3484: Logger.getLogger(XMLFileFeatures.class); bjoern@3476: sascha@3484: private Map> featuremap = sascha@3484: new HashMap>(); bjoern@3476: bjoern@3481: private final static String XPATH_FEATURES = "ftr:feature/child::text()"; bjoern@3481: private final static String XPATH_ROLES = "/ftr:features/ftr:role"; bjoern@3481: bjoern@3476: public XMLFileFeatures(String filename) throws IOException { bjoern@3476: FileInputStream finput = new FileInputStream(filename); christian@4632: logger.debug("XMLFileFeatures: " + filename); bjoern@3481: try { bjoern@3481: Document doc = XMLUtils.parseDocument(finput); bjoern@3476: bjoern@3481: NodeList roles = (NodeList) XMLUtils.xpath( bjoern@3481: doc, bjoern@3481: XPATH_ROLES, bjoern@3476: XPathConstants.NODESET, bjoern@3476: FeaturesNamespaceContext.INSTANCE); bjoern@3476: sascha@3484: for(int i = 0, m = roles.getLength(); i < m; i++) { bjoern@3481: Element rolenode = (Element)roles.item(i); bjoern@3476: bjoern@3487: String name = rolenode.getAttribute("name"); bjoern@3481: bjoern@3481: logger.debug("Found role: " + name); bjoern@3481: bjoern@3481: NodeList features = (NodeList) XMLUtils.xpath( bjoern@3481: rolenode, bjoern@3481: XPATH_FEATURES, bjoern@3481: XPathConstants.NODESET, bjoern@3481: FeaturesNamespaceContext.INSTANCE); bjoern@3481: sascha@3484: if (features == null) { sascha@3484: continue; sascha@3484: } sascha@3484: sascha@3484: int N = features.getLength(); sascha@3484: sascha@3484: if (N > 0) { sascha@3484: List allowed = new ArrayList(N); sascha@3484: for (int j = 0; j < N; j++) { bjoern@3481: Node featurenode = features.item(j); bjoern@3481: String featurename = featurenode.getNodeValue(); bjoern@3481: bjoern@3481: logger.debug("Found feature: " + featurename); bjoern@3481: bjoern@3481: allowed.add(featurename); bjoern@3481: } bjoern@3481: featuremap.put(name, allowed); bjoern@3476: } bjoern@3476: } bjoern@3481: logger.debug("Loaded all features"); bjoern@3476: } bjoern@3481: finally { bjoern@3481: finput.close(); bjoern@3481: } bjoern@3476: } bjoern@3476: bjoern@3476: @Override bjoern@3476: public List getFeatures(List roles) { sascha@3484: List features = new ArrayList(); bjoern@3476: bjoern@3476: for (String role: roles) { bjoern@3476: List allowed = this.featuremap.get(role); sascha@3484: if (allowed != null) { bjoern@3476: features.addAll(allowed); bjoern@3476: } bjoern@3476: } bjoern@3476: return features; bjoern@3476: } bjoern@3476: }