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