package com.googlecode.tawus.internal;
import java.io.Serializable;
import org.apache.tapestry5.internal.services.SessionApplicationStatePersistenceStrategy;
import org.apache.tapestry5.services.ApplicationStateCreator;
import org.apache.tapestry5.services.Request;
import com.googlecode.tawus.TawusUtils;
import com.googlecode.tawus.services.EntityDAOLocator;
public class EntityApplicationStatePersistenceStrategy extends SessionApplicationStatePersistenceStrategy
{
private final EntityDAOLocator locator;
public EntityApplicationStatePersistenceStrategy(final Request request, final EntityDAOLocator locator)
{
super(request);
this.locator = locator;
}
@Override
@SuppressWarnings("unchecked")
public <T> T get(final Class<T> ssoClass, final ApplicationStateCreator<T> creator)
{
final Object object = getOrCreate(ssoClass, creator);
if(object instanceof PersistedEntity)
{
@SuppressWarnings("rawtypes")
final PersistedEntity entity = (PersistedEntity) object;
final Object restoredEntity;
restoredEntity = locator.get(entity.getEntityClass()).find(entity.getId());
return (T) restoredEntity;
}
return (T) object;
}
@Override
@SuppressWarnings({ "unchecked", "rawtypes" })
public <T> void set(Class<T> ssoClass, T sso)
{
final String key = buildKey(ssoClass);
final Object entity;
if(sso != null)
{
if(!TawusUtils.isEntity(sso))
{
entity = sso;
}
else
{
Serializable id = locator.get(ssoClass).getIdentifier(sso);
entity = new PersistedEntity(sso.getClass(), id);
}
}
else
{
entity = null;
}
getSession().setAttribute(key, entity);
}
}