blob: d20a45da6004ebf6d46e2a3f1686e52da903f80f [file] [log] [blame]
package com.xtremelabs.robolectric.res;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class ResourceReferenceResolver<T> {
private Map<String, T> attributeNamesToValues = new HashMap<String, T>();
private Map<String, List<String>> unresolvedReferences = new HashMap<String, List<String>>();
private String prefix;
ResourceReferenceResolver(String prefix) {
this.prefix = prefix;
}
public T getValue(String resourceName) {
return attributeNamesToValues.get(resourceName);
}
public void processResource(String name, String rawValue, ResourceValueConverter loader) {
if (rawValue.startsWith("@" + prefix)) {
addAttributeReference(name, rawValue);
} else {
addAttribute(prefix + "/" + name, (T) loader.convertRawValue(rawValue));
}
}
private void resolveUnresolvedReferences(String attributeName, T value) {
List<String> references = unresolvedReferences.remove(attributeName);
if (references == null) {
return;
}
for (String reference : references) {
attributeNamesToValues.put(reference, value);
}
}
private void addUnresolvedReference(String valuePointer, String attributeName) {
List<String> references = unresolvedReferences.get(attributeName);
if (references == null) {
references = new ArrayList<String>();
unresolvedReferences.put(attributeName, references);
}
references.add(valuePointer);
}
public void addAttribute(String attributeName, T value) {
attributeNamesToValues.put(attributeName, value);
resolveUnresolvedReferences(attributeName, value);
}
private void addAttributeReference(String name, String rawValue) {
String valuePointer = prefix + "/" + name;
String attributeName = rawValue.substring(1);
T value = attributeNamesToValues.get(attributeName);
if (value == null) {
addUnresolvedReference(valuePointer, attributeName);
} else {
attributeNamesToValues.put(valuePointer, value);
}
}
}