/*
* Ext GWT - Ext for GWT
* Copyright(c) 2007-2009, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
package com.extjs.gxt.ui.client.data;
import java.util.HashMap;
import java.util.Map;
import com.extjs.gxt.ui.client.core.FastMap;
/**
* Allows multiple providers to be registered by data type and property name.
*/
public class AggregateModelStringProvider<M extends ModelData> implements ModelStringProvider<M> {
private static ModelStringProvider<ModelData> defaultProvider = new ModelStringProvider<ModelData>() {
public String getStringValue(ModelData model, String property) {
Object value = model.get(property);
return value != null ? value.toString() : null;
}
};
private ModelStringProvider<M> stringProvider;
private Map<String, ModelStringProvider<M>> propertyProviders;
private Map<Class<?>, ModelStringProvider<M>> classProviders;
/**
* Registers a provider by property name.
*
* @param property the property name
* @param provider the string provider
*/
public void register(String property, ModelStringProvider<M> provider) {
if (propertyProviders == null) {
propertyProviders = new FastMap<ModelStringProvider<M>>();
}
propertyProviders.put(property, provider);
}
/**
* Registers a provider by type.
*
* @param type the type
* @param provider the string provider
*/
public void register(Class<?> type, ModelStringProvider<M> provider) {
if (classProviders == null) {
classProviders = new HashMap<Class<?>, ModelStringProvider<M>>();
}
classProviders.put(type, provider);
}
/**
* Sets the default provider. This provider will be used of no others
* providers match the request.
*
* @param provider the default string provider
*/
public void setDefault(ModelStringProvider<M> provider) {
this.stringProvider = provider;
}
@SuppressWarnings("unchecked")
public String getStringValue(M model, String property) {
if (propertyProviders != null && propertyProviders.containsKey(property)) {
return propertyProviders.get(property).getStringValue(model, property);
}
if (classProviders != null && model.get(property) != null) {
Class<?> clz = model.<Object> get(property).getClass();
if (classProviders.containsKey(clz)) {
return classProviders.get(clz).getStringValue(model, property);
}
}
ModelStringProvider<M> temp = stringProvider != null ? stringProvider : (ModelStringProvider)defaultProvider;
return temp.getStringValue(model, property);
}
}