AttrResourceLoader.java revision 4ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29
1package com.xtremelabs.robolectric.res;
2
3import android.view.View;
4import org.w3c.dom.Document;
5import org.w3c.dom.Node;
6import org.w3c.dom.NodeList;
7
8import javax.xml.xpath.XPathConstants;
9import javax.xml.xpath.XPathExpression;
10import javax.xml.xpath.XPathFactory;
11import java.io.File;
12import java.util.HashMap;
13import java.util.HashSet;
14import java.util.Map;
15import java.util.Set;
16
17public class AttrResourceLoader extends XmlLoader {
18    Map<String, String> classAttrEnumToValue = new HashMap<String, String>();
19    Set<String> knownClassAttrs = new HashSet<String>();
20
21    public AttrResourceLoader(ResourceExtractor resourceExtractor) {
22        super(resourceExtractor);
23    }
24
25    @Override protected void processResourceXml(File xmlFile, Document document) throws Exception {
26        XPathExpression stringsXPath = XPathFactory.newInstance().newXPath().compile("/resources/declare-styleable/attr/enum");
27        NodeList stringNodes = (NodeList) stringsXPath.evaluate(document, XPathConstants.NODESET);
28        for (int i = 0; i < stringNodes.getLength(); i++) {
29            Node node = stringNodes.item(i);
30            String viewName = node.getParentNode().getParentNode().getAttributes().getNamedItem("name").getNodeValue();
31            String enumName = node.getParentNode().getAttributes().getNamedItem("name").getNodeValue();
32            String name = node.getAttributes().getNamedItem("name").getNodeValue();
33            String value = node.getAttributes().getNamedItem("value").getNodeValue();
34
35            classAttrEnumToValue.put(key(viewName, enumName, name), value);
36            knownClassAttrs.add(key(viewName, enumName));
37        }
38    }
39
40    public String convertValueToEnum(Class<? extends View> viewClass, String namespace, String attrName, String attrValue) {
41        String className = findKnownAttrClass(attrName, viewClass).getName();
42        return classAttrEnumToValue.get(key(className, attrName, attrValue));
43    }
44
45    public boolean hasAttributeFor(Class<? extends View> viewClass, String namespace, String attrName) {
46        return findKnownAttrClass(attrName, viewClass) != null;
47    }
48
49    private Class<?> findKnownAttrClass(String attrName, Class<?> clazz) {
50        while (clazz != null) {
51            if (knownClassAttrs.contains(key(clazz.getName(), attrName))) {
52                return clazz;
53            }
54            clazz = clazz.getSuperclass();
55        }
56        return null;
57    }
58
59    private String key(String viewName, String attrName, String name) {
60        return viewName + "#" + attrName + "#" + name;
61    }
62
63    private String key(String viewName, String attrName) {
64        return viewName + "#" + attrName;
65    }
66}
67