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@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@3476: public XMLFileFeatures(String filename) throws IOException { bjoern@3476: FileInputStream finput = new FileInputStream(filename); bjoern@3476: Document doc = XMLUtils.parseDocument(finput); bjoern@3476: bjoern@3476: String XPATH_FEATURES = "ftr:feature/child::text()"; bjoern@3476: String XPATH_ROLES = "/ftr:features/ftr:role"; bjoern@3476: bjoern@3476: NodeList roles = (NodeList) XMLUtils.xpath( bjoern@3476: doc, bjoern@3476: XPATH_ROLES, bjoern@3476: XPathConstants.NODESET, bjoern@3476: FeaturesNamespaceContext.INSTANCE); bjoern@3476: bjoern@3476: for(int i=0; i < roles.getLength(); i++) { bjoern@3476: Node rolenode = roles.item(i); bjoern@3476: bjoern@3476: String name = XMLUtils.xpathString( bjoern@3476: rolenode, "@name", FeaturesNamespaceContext.INSTANCE); bjoern@3476: bjoern@3476: logger.debug("Found role: " + name); bjoern@3476: bjoern@3476: NodeList features = (NodeList) XMLUtils.xpath( bjoern@3476: rolenode, bjoern@3476: XPATH_FEATURES, bjoern@3476: XPathConstants.NODESET, bjoern@3476: FeaturesNamespaceContext.INSTANCE); bjoern@3476: bjoern@3476: if (features.getLength() > 0) { bjoern@3476: List allowed = new LinkedList(); bjoern@3476: for (int j=0; j < features.getLength(); j++) { bjoern@3476: Node featurenode = features.item(j); bjoern@3476: String featurename = featurenode.getNodeValue(); bjoern@3476: bjoern@3476: logger.debug("found feature: " + featurename); bjoern@3476: bjoern@3476: allowed.add(featurename); bjoern@3476: } bjoern@3476: featuremap.put(name, allowed); bjoern@3476: } bjoern@3476: } bjoern@3476: logger.debug("Loaded all features"); bjoern@3476: bjoern@3476: finput.close(); 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: }