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