1 package com.xtremelabs.robolectric.res;
2 
3 import org.w3c.dom.Node;
4 
5 public class IntegerResourceLoader extends XTagXmlResourceLoader implements ResourceValueConverter {
6 
7 	private final ResourceReferenceResolver< Integer > integerResolver = new ResourceReferenceResolver< Integer >( "integer" );
8 
IntegerResourceLoader( ResourceExtractor resourceExtractor )9 	public IntegerResourceLoader( ResourceExtractor resourceExtractor ) {
10 		super( resourceExtractor, "integer" );
11 	}
12 
getValue( int resourceId )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 
getValue( String resourceName, boolean isSystem )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
convertRawValue( String rawValue )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
processNode( Node node, String name, boolean isSystem )48 	protected void processNode( Node node, String name, boolean isSystem ) {
49 		integerResolver.processResource( name, node.getTextContent(), this, isSystem );
50 	}
51 
52 }
53