package org.aksw.jena_sparql_api.mapper.context;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.Map;
/**
* An object for associating information with beans
*
* @author raven
*
*/
public class EntityContextImpl<T>
implements EntityContext<T>
{
protected Map<T, Map<String, Object>> entityStates;
public EntityContextImpl() {
this(new HashMap<T, Map<String, Object>>());
}
public EntityContextImpl(Map<T, Map<String, Object>> beanStates) {
super();
this.entityStates = beanStates;
}
/* (non-Javadoc)
* @see org.aksw.jena_sparql_api.mapper.context.EntityContext#get(java.lang.Object)
*/
@Override
public Map<String, Object> get(Object entity) {
checkManaged(entity);
Map<String, Object> result = entityStates.get(entity);
return result;
}
/* (non-Javadoc)
* @see org.aksw.jena_sparql_api.mapper.context.EntityContext#getOrCreate(T)
*/
@Override
public Map<String, Object> getOrCreate(T entity) {
Map<String, Object> result = isManaged(entity)
? get(entity)
: register(entity)
;
return result;
}
/* (non-Javadoc)
* @see org.aksw.jena_sparql_api.mapper.context.EntityContext#register(T)
*/
@Override
public Map<String, Object> register(T entity) {
Map<String, Object> result = new HashMap<String, Object>();
entityStates.put(entity, result);
return result;
}
public void checkManaged(Object entity) {
if(!isManaged(entity)) {
throw new RuntimeException("Entity was expected to be managed: " + entity);
}
}
/* (non-Javadoc)
* @see org.aksw.jena_sparql_api.mapper.context.EntityContext#getState(java.lang.Object)
*/
@Override
public Map<String, Object> getState(Object entity) {
checkManaged(entity);
Map<String, Object> result = entityStates.get(entity);
return result;
}
/* (non-Javadoc)
* @see org.aksw.jena_sparql_api.mapper.context.EntityContext#isManaged(java.lang.Object)
*/
@Override
public boolean isManaged(Object entity) {
boolean result = entityStates.containsKey(entity);
return result;
}
public static <T> EntityContext<T> createIdentityContext(Class<T> clazz) {
Map<T, Map<String, Object>> map = new IdentityHashMap<T, Map<String, Object>>();
EntityContext<T> result = new EntityContextImpl<T>(map);
return result;
}
@Override
public void setAttribute(T entity, String attribute, Object value) {
Map<String, Object> map = getOrCreate(entity);
map.put(attribute, value);
}
@Override
public <X> X getAttribute(Object entity, String attribute, X defaultValue) {
@SuppressWarnings("unchecked")
X result = isManaged(entity)
? (X)getState(entity).get(attribute)
: defaultValue
;
return result;
}
}