/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.properties;
import gw.lang.reflect.IAnnotationInfo;
import gw.lang.reflect.IPropertyAccessor;
import gw.lang.reflect.IType;
import gw.lang.reflect.PropertyInfoBase;
import gw.lang.reflect.java.IJavaType;
import gw.lang.reflect.java.JavaTypes;
import gw.lang.reflect.java.JavaTypes;
import java.util.Collections;
import java.util.List;
/**
* PropertyInfo implementation for properties within a {@link PropertiesTypeInfo}
*/
class PropertiesPropertyInfo extends PropertyInfoBase implements IPropertiesPropertyInfo {
private final PropertyNode _propertyNode;
private final boolean _isStatic;
private final IPropertyAccessor _accessor = new IPropertyAccessor() {
@Override
public Object getValue(Object ctx) {
return _propertyNode.isLeaf() ? _propertyNode.getValue() : _propertyNode;
}
@Override
public void setValue(Object ctx, Object value) {
throw new UnsupportedOperationException("Should never be set, property is not writeable");
}
};
public PropertiesPropertyInfo(PropertiesTypeInfo typeInfo, PropertyNode propertyNode, boolean isStatic) {
super(typeInfo);
_propertyNode = propertyNode;
_isStatic = isStatic;
}
@Override
public IPropertyAccessor getAccessor() {
return _accessor;
}
@Override
public boolean isReadable() {
return true;
}
@Override
public boolean isWritable(IType whosAskin) {
return false;
}
@Override
public boolean isStatic() {
return _isStatic;
}
@Override
public List<IAnnotationInfo> getDeclaredAnnotations() {
return Collections.emptyList();
}
@Override
public String getName() {
return _propertyNode.getRelativeName();
}
@Override
public IType getFeatureType() {
return _propertyNode.isLeaf() ? JavaTypes.STRING() : _propertyNode.getIntrinsicType();
}
@Override
public boolean hasAnnotation(IType type) {
return false;
}
public String getPropertyEntryName()
{
return _propertyNode.getPath();
}
}