package org.molgenis.data.support;
import org.molgenis.data.DataService;
import org.molgenis.data.Entity;
import org.molgenis.data.UnknownEntityException;
import org.molgenis.data.meta.model.Attribute;
import org.molgenis.data.meta.model.EntityType;
import java.sql.Date;
import java.sql.Timestamp;
import static java.util.Objects.requireNonNull;
public class LazyEntity implements Entity
{
private static final long serialVersionUID = 1L;
private final EntityType entityType;
private final DataService dataService;
private final Object id;
private Entity entity;
public LazyEntity(EntityType entityType, DataService dataService, Object id)
{
this.entityType = requireNonNull(entityType);
this.dataService = requireNonNull(dataService);
this.id = requireNonNull(id);
}
@Override
public Object getIdValue()
{
return id;
}
@Override
public void setIdValue(Object id)
{
throw new UnsupportedOperationException("Identifier of a lazy entity cannot be modified");
}
public EntityType getEntityType()
{
return entityType;
}
@Override
public Iterable<String> getAttributeNames()
{
return EntityTypeUtils.getAttributeNames(entityType.getAtomicAttributes());
}
@Override
public Object getLabelValue()
{
Attribute idAttr = entityType.getIdAttribute();
Attribute labelAttr = entityType.getLabelAttribute();
if (idAttr.equals(labelAttr))
{
return id;
}
else
{
return getLazyLoadedEntity().getLabelValue();
}
}
@Override
public Object get(String attributeName)
{
Attribute idAttr = entityType.getIdAttribute();
if (attributeName.equals(idAttr.getName()))
{
return id;
}
return getLazyLoadedEntity().get(attributeName);
}
@Override
public String getString(String attributeName)
{
Attribute idAttr = entityType.getIdAttribute();
if (attributeName.equals(idAttr.getName()))
{
return (String) id;
}
return getLazyLoadedEntity().getString(attributeName);
}
@Override
public Integer getInt(String attributeName)
{
Attribute idAttr = entityType.getIdAttribute();
if (attributeName.equals(idAttr.getName()))
{
return (Integer) id;
}
return getLazyLoadedEntity().getInt(attributeName);
}
@Override
public Long getLong(String attributeName)
{
return getLazyLoadedEntity().getLong(attributeName);
}
@Override
public Boolean getBoolean(String attributeName)
{
return getLazyLoadedEntity().getBoolean(attributeName);
}
@Override
public Double getDouble(String attributeName)
{
return getLazyLoadedEntity().getDouble(attributeName);
}
@Override
public Date getDate(String attributeName)
{
return getLazyLoadedEntity().getDate(attributeName);
}
@Override
public java.util.Date getUtilDate(String attributeName)
{
return getLazyLoadedEntity().getUtilDate(attributeName);
}
@Override
public Timestamp getTimestamp(String attributeName)
{
return getLazyLoadedEntity().getTimestamp(attributeName);
}
@Override
public Entity getEntity(String attributeName)
{
return getLazyLoadedEntity().getEntity(attributeName);
}
@Override
public <E extends Entity> E getEntity(String attributeName, Class<E> clazz)
{
return getLazyLoadedEntity().getEntity(attributeName, clazz);
}
@Override
public Iterable<Entity> getEntities(String attributeName)
{
return getLazyLoadedEntity().getEntities(attributeName);
}
@Override
public <E extends Entity> Iterable<E> getEntities(String attributeName, Class<E> clazz)
{
return getLazyLoadedEntity().getEntities(attributeName, clazz);
}
@Override
public void set(String attributeName, Object value)
{
getLazyLoadedEntity().set(attributeName, value);
}
@Override
public void set(Entity values)
{
getLazyLoadedEntity().set(values);
}
private Entity getLazyLoadedEntity()
{
if (entity == null)
{
entity = dataService.findOneById(entityType.getName(), id);
if (entity == null)
{
throw new UnknownEntityException(
"entity [" + entityType.getName() + "] with " + entityType.getIdAttribute().getName() + " ["
+ id.toString() + "] does not exist");
}
}
return entity;
}
@Override
public String toString()
{
if (entity != null)
{
return entity.toString();
}
else
{
return entityType.getName() + '{' + entityType.getIdAttribute().getName() + '=' + id
+ ",<lazy attributes not loaded>}";
}
}
}