package org.robobinding.property;
import java.util.Map;
import java.util.Set;
import org.robobinding.util.Maps;
/**
* @since 1.0
* @author Cheng Wei
*
*/
public class LazyProperties implements Properties {
private final Class<?> beanClass;
private final Map<String, PropertyValueModel> properties;
private final Map<String, DataSetPropertyValueModel> dataSetProperties;
private final PropertyWithDependencySupply supply;
public LazyProperties(Class<?> beanClass, Set<String> propertyNames, Set<String> dataSetPropertyNames,
PropertyWithDependencySupply supply) {
this.beanClass = beanClass;
this.supply = supply;
properties = Maps.newHashMap();
dataSetProperties = Maps.newHashMap();
initializeProperties(propertyNames);
initializeDataSetProperties(dataSetPropertyNames);
}
private void initializeProperties(Set<String> propertyNames) {
for(String propertyName : propertyNames) {
properties.put(propertyName, null);
}
}
private void initializeDataSetProperties(Set<String> dataSetPropertyNames) {
for(String propertyName : dataSetPropertyNames) {
dataSetProperties.put(propertyName, null);
}
}
@SuppressWarnings("unchecked")
@Override
public <T> ValueModel<T> getReadOnlyProperty(String propertyName) {
return (ValueModel<T>) getProperty(propertyName, false);
}
private PropertyValueModel getProperty(String propertyName, boolean isReadWriteProperty) {
if(!properties.containsKey(propertyName)) {
throw new RuntimeException("No such property '"+describeProperty(propertyName)+"'");
}
PropertyValueModel property = properties.get(propertyName);
if (property == null) {
properties.put(propertyName, supply.createProperty(propertyName));
property = properties.get(propertyName);
}
property.checkReadWriteProperty(isReadWriteProperty);
return property;
}
private String describeProperty(String propertyName) {
return PropertyUtils.shortDescription(beanClass, propertyName);
}
@SuppressWarnings("unchecked")
@Override
public <T> ValueModel<T> getReadWriteProperty(String propertyName) {
return (ValueModel<T>) getProperty(propertyName, true);
}
@Override
public Class<?> getPropertyType(String propertyName) {
PropertyValueModel property = getProperty(propertyName, false);
return property.getPropertyType();
}
@Override
public DataSetValueModel getDataSetProperty(String propertyName) {
if(!dataSetProperties.containsKey(propertyName)) {
throw new RuntimeException("No such dataSet property '"+describeProperty(propertyName)+"'");
}
DataSetPropertyValueModel property = dataSetProperties.get(propertyName);
if (property == null) {
dataSetProperties.put(propertyName, supply.createDataSetProperty(propertyName));
property = dataSetProperties.get(propertyName);
}
return property;
}
}