1package com.xtremelabs.robolectric.res;
2
3import org.w3c.dom.Node;
4
5public class IntegerResourceLoader extends XTagXmlResourceLoader implements ResourceValueConverter {
6
7	private final ResourceReferenceResolver< Integer > integerResolver = new ResourceReferenceResolver< Integer >( "integer" );
8
9	public IntegerResourceLoader( ResourceExtractor resourceExtractor ) {
10		super( resourceExtractor, "integer" );
11	}
12
13	public int getValue( int resourceId ) {
14        final String resourceIdDebugString = String.valueOf(resourceId) + " (" + "0x" + Integer.toHexString(resourceId) + ")";
15		String resourceName = resourceExtractor.getResourceName(resourceId);
16        if (resourceName == null) {
17            throw new IllegalArgumentException("No such resource: " + resourceId);
18        }
19        Integer value = integerResolver.getValue(resourceName);
20        if (value == null) { // instead of auto-unboxing NPE
21            throw new IllegalArgumentException("Got resource name " + resourceName + " from id " + resourceIdDebugString
22                                                   + ", but found no resource by that name");
23        }
24        return value;
25	}
26
27	public int getValue( String resourceName, boolean isSystem ) {
28        Integer resourceId = resourceExtractor.getResourceId(resourceName, isSystem);
29        if (resourceName == null) {
30            throw new IllegalArgumentException("No such resource (" + isSystem + "): " + resourceName);
31        }
32        return getValue(resourceId);
33	}
34
35	@Override
36	public Object convertRawValue( String rawValue ) {
37		try {
38            // Decode into long, because there are some large hex values in the android resource files
39            // (e.g. config_notificationsBatteryLowARGB = 0xFFFF0000 in sdk 14).
40            // Integer.decode() does not support large, i.e. negative values in hex numbers.
41            return (int) Long.decode(rawValue).longValue();
42		} catch ( NumberFormatException nfe ) {
43			throw new RuntimeException( rawValue + " is not an integer." , nfe );
44		}
45	}
46
47	@Override
48	protected void processNode( Node node, String name, boolean isSystem ) {
49		integerResolver.processResource( name, node.getTextContent(), this, isSystem );
50	}
51
52}
53