1a2043a8fff01f3e2d9a5e30dd1cf5fb6a5342f4dTyler Schultzpackage com.xtremelabs.robolectric.res;
2613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher
34c5b57087396dc85c042e3d82a349288b3ecded2Ian Fisher & Phil Goodwinimport android.view.View;
4613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisherimport org.w3c.dom.Document;
5613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisherimport org.w3c.dom.Node;
6613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisherimport org.w3c.dom.NodeList;
7613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher
8613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisherimport javax.xml.xpath.XPathConstants;
9613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisherimport javax.xml.xpath.XPathExpression;
10613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisherimport javax.xml.xpath.XPathFactory;
11613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisherimport java.io.File;
12613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisherimport java.util.HashMap;
13613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisherimport java.util.HashSet;
14613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisherimport java.util.Map;
15613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisherimport java.util.Set;
16613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher
17613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisherpublic class AttrResourceLoader extends XmlLoader {
18613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher    Map<String, String> classAttrEnumToValue = new HashMap<String, String>();
19613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher    Set<String> knownClassAttrs = new HashSet<String>();
20613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher
21613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher    public AttrResourceLoader(ResourceExtractor resourceExtractor) {
22613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher        super(resourceExtractor);
23613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher    }
24613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher
251e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw    @Override
261e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw    protected void processResourceXml(File xmlFile, Document document, boolean isSystem) throws Exception {
27613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher        XPathExpression stringsXPath = XPathFactory.newInstance().newXPath().compile("/resources/declare-styleable/attr/enum");
28613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher        NodeList stringNodes = (NodeList) stringsXPath.evaluate(document, XPathConstants.NODESET);
29613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher        for (int i = 0; i < stringNodes.getLength(); i++) {
30613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher            Node node = stringNodes.item(i);
31613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher            String viewName = node.getParentNode().getParentNode().getAttributes().getNamedItem("name").getNodeValue();
32613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher            String enumName = node.getParentNode().getAttributes().getNamedItem("name").getNodeValue();
33613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher            String name = node.getAttributes().getNamedItem("name").getNodeValue();
34613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher            String value = node.getAttributes().getNamedItem("value").getNodeValue();
35613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher
361e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw            classAttrEnumToValue.put(key(viewName, enumName, name, isSystem), value);
371e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw            knownClassAttrs.add(key(viewName, enumName, isSystem));
38613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher        }
39613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher    }
40613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher
414c5b57087396dc85c042e3d82a349288b3ecded2Ian Fisher & Phil Goodwin    public String convertValueToEnum(Class<? extends View> viewClass, String namespace, String attrName, String attrValue) {
421e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw        boolean isSystem = "android".equals(namespace);
431e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw        String className = findKnownAttrClass(attrName, viewClass, isSystem);
441e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw        return classAttrEnumToValue.get(key(className, attrName, attrValue, isSystem));
45613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher    }
46613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher
474c5b57087396dc85c042e3d82a349288b3ecded2Ian Fisher & Phil Goodwin    public boolean hasAttributeFor(Class<? extends View> viewClass, String namespace, String attrName) {
481e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw        boolean isSystem = "android".equals(namespace);
491e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw        return findKnownAttrClass(attrName, viewClass, isSystem) != null;
504c5b57087396dc85c042e3d82a349288b3ecded2Ian Fisher & Phil Goodwin    }
514c5b57087396dc85c042e3d82a349288b3ecded2Ian Fisher & Phil Goodwin
521e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw    private String findKnownAttrClass(String attrName, Class<?> clazz, boolean isSystem) {
534c5b57087396dc85c042e3d82a349288b3ecded2Ian Fisher & Phil Goodwin        while (clazz != null) {
541e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw            String className = clazz.getName();
551e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw            if (isSystem) {
561e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw                className = clazz.getSimpleName();
571e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw            }
581e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw            if (knownClassAttrs.contains(key(className, attrName, isSystem))) {
591e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw                return className;
604c5b57087396dc85c042e3d82a349288b3ecded2Ian Fisher & Phil Goodwin            }
614c5b57087396dc85c042e3d82a349288b3ecded2Ian Fisher & Phil Goodwin            clazz = clazz.getSuperclass();
624c5b57087396dc85c042e3d82a349288b3ecded2Ian Fisher & Phil Goodwin        }
634c5b57087396dc85c042e3d82a349288b3ecded2Ian Fisher & Phil Goodwin        return null;
64613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher    }
65613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher
661e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw    private String key(String viewName, String attrName, String name, boolean isSystem) {
671e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw        return key(viewName, attrName, isSystem) + "#" + name;
68613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher    }
69613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher
701e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw    private String key(String viewName, String attrName, boolean isSystem) {
711e92500053a1bc745ec8b8d600ac42a13e29271aJesse Toth & Tim Labeeuw        return (isSystem ? "android:" : "") + viewName + "#" + attrName;
72613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher    }
73613a45744127aa01759b49930e4e111128f563d5Christian Williams & Ian Fisher}
74