package org.odata4j.producer.inmemory; import org.core4j.Enumerable; import org.core4j.Func1; public class EntityIdFunctionPropertyModelDelegate<TEntity, TKey> extends PropertyModelDelegate { private final PropertyModel propertyModel; private final String idPropertyName; private final Class<TKey> idPropertyType; private final Func1<TEntity, TKey> id; public EntityIdFunctionPropertyModelDelegate(PropertyModel propertyModel, String idPropertyName, Class<TKey> idPropertyType, Func1<TEntity, TKey> id) { this.propertyModel = propertyModel; this.idPropertyName = idPropertyName; this.idPropertyType = idPropertyType; this.id = id; } @Override public PropertyModel getDelegate() { return propertyModel; } @Override public Iterable<String> getPropertyNames() { return Enumerable.create(idPropertyName).concat(Enumerable.create(super.getPropertyNames())); } @Override public Class<?> getPropertyType(String propertyName) { if (propertyName.equals(idPropertyName)) return idPropertyType; return super.getPropertyType(propertyName); } @SuppressWarnings("unchecked") @Override public Object getPropertyValue(Object target, String propertyName) { if (propertyName.equals(idPropertyName)) return id.apply((TEntity) target); return super.getPropertyValue(target, propertyName); } }