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; bjoern@3476: import java.util.Hashtable; bjoern@3476: import java.util.List; bjoern@3476: import java.util.LinkedList; 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: bjoern@3476: private static final Logger logger = Logger.getLogger(XMLFileFeatures.class); bjoern@3476: bjoern@3476: private Hashtable> featuremap = new Hashtable>(); 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); bjoern@3476: 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: bjoern@3481: for(int i=0, m = roles.getLength(); i < m; i++) { bjoern@3481: Element rolenode = (Element)roles.item(i); bjoern@3476: bjoern@3481: String name = rolenode.getAttributeNS( bjoern@3481: FeaturesNamespaceContext.NAMESPACE_URI, "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: bjoern@3481: if (features.getLength() > 0) { bjoern@3481: List allowed = new ArrayList(features.getLength()); bjoern@3481: for (int j=0, l = features.getLength(); j < l; 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) { bjoern@3476: List features = new LinkedList(); bjoern@3476: bjoern@3476: for (String role: roles) { bjoern@3476: List allowed = this.featuremap.get(role); bjoern@3476: if (!allowed.isEmpty()) { bjoern@3476: features.addAll(allowed); bjoern@3476: } bjoern@3476: } bjoern@3476: return features; bjoern@3476: } bjoern@3476: }