/*
* Ext GWT 2.2.4 - Ext for GWT
* Copyright(c) 2007-2010, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
package com.extjs.gxt.ui.client.data;
import java.util.ArrayList;
import java.util.List;
/**
* A <code>DataReader</code> for beans using a <code>BeanModelFactory</code>.
* Valid return types are a list of beans or a list load result containing a
* list of beans. Beans must be of the same type and beans must implement
* {@link BeanModelTag} or have a companion {@link BeanModelMarker} marker
* class.
*/
public class BeanModelReader implements DataReader<ListLoadResult<ModelData>> {
private boolean factoryForEachBean;
/**
* Return if a BeanModelFactory is created for each bean or not.
*
* @return true if a BeanModelFactory is created for each bean or not
*/
public boolean isFactoryForEachBean() {
return factoryForEachBean;
}
@SuppressWarnings({"unchecked", "rawtypes"})
public ListLoadResult<ModelData> read(Object loadConfig, Object data) {
if (data instanceof List) {
List<Object> beans = (List) data;
if (beans.size() > 0) {
if (factoryForEachBean) {
List models = new ArrayList(beans.size());
for (Object o : beans) {
BeanModelFactory factory = BeanModelLookup.get().getFactory(o.getClass());
assert factory != null : "No BeanModelFactory found for " + o.getClass();
models.add(factory.createModel(o));
}
return newLoadResult(loadConfig, models);
} else {
BeanModelFactory factory = BeanModelLookup.get().getFactory(beans.get(0).getClass());
assert factory != null : "No BeanModelFactory found for " + beans.get(0).getClass();
return newLoadResult(loadConfig, (List) factory.createModel(beans));
}
}
return newLoadResult(loadConfig, (List) beans);
} else if (data instanceof ListLoadResult) {
ListLoadResult result = (ListLoadResult) data;
List beans = result.getData();
if (beans.size() > 0) {
List converted;
if (factoryForEachBean) {
converted = new ArrayList(beans.size());
for (Object o : beans) {
BeanModelFactory factory = BeanModelLookup.get().getFactory(o.getClass());
assert factory != null : "No BeanModelFactory found for " + o.getClass();
converted.add(factory.createModel(o));
}
} else {
BeanModelFactory factory = BeanModelLookup.get().getFactory(beans.get(0).getClass());
assert factory != null : "No BeanModelFactory found for " + beans.get(0).getClass();
converted = factory.createModel(beans);
}
beans.clear();
beans.addAll(converted);
}
return (ListLoadResult) data;
}
assert false : "Error converting data";
return null;
}
/**
* Set to true to create a BeanModelFactory for each bean in the list
* (defaults to false).
*
* @param factoryForEachBean true to enable
*/
public void setFactoryForEachBean(boolean factoryForEachBean) {
this.factoryForEachBean = factoryForEachBean;
}
/**
* Template method that provides a new load result.
*
* @param models the models
* @return the load result
*/
protected ListLoadResult<ModelData> newLoadResult(Object loadConfig, List<ModelData> models) {
return new BaseListLoadResult<ModelData>(models);
}
}