/*
* 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.ArrayList;
import java.util.Arrays;
import java.util.List;
public class NestedModelUtil {
@SuppressWarnings("unchecked")
public static <X> X getNestedValue(ModelData model, String property) {
List<String> paths = Arrays.asList(property.split("\\."));
return (X) getNestedValue(model, paths);
}
public static Object convertIfNecessary(Object obj) {
if (obj instanceof BeanModelTag) {
BeanModelFactory factory = BeanModelLookup.get().getFactory(obj.getClass());
obj = factory.createModel(obj);
}
return obj;
}
@SuppressWarnings("unchecked")
public static <X> X getNestedValue(ModelData model, List<String> paths) {
if (paths.size() == 1) {
Object obj = model.get(paths.get(0));
obj = convertIfNecessary(obj);
return (X) obj;
} else {
Object obj = model.get(paths.get(0));
obj = convertIfNecessary(obj);
if (obj != null && obj instanceof ModelData) {
ArrayList<String> tmp = new ArrayList<String>(paths);
tmp.remove(0);
return (X) getNestedValue((ModelData) obj, tmp);
}
}
return null;
}
@SuppressWarnings("unchecked")
public static <X> X setNestedValue(ModelData model, String property, Object value) {
List<String> paths = Arrays.asList(property.split("\\."));
return (X) setNestedValue(model, paths, value);
}
@SuppressWarnings("unchecked")
public static <X> X setNestedValue(ModelData model, List<String> paths, Object value) {
if (paths.size() == 1) {
return (X) model.set(paths.get(0), value);
} else {
Object data = model.get(paths.get(0));
if (data != null && data instanceof ModelData) {
ArrayList<String> tmp = new ArrayList<String>(paths);
tmp.remove(0);
return (X) setNestedValue((ModelData) data, tmp, value);
}
}
return null;
}
public static boolean isNestedProperty(String property) {
return property.indexOf(".") != -1;
}
}