package org.om.core.impl.persistence.interceptor;
import org.om.core.api.exception.ObjectMapperException;
import org.om.core.api.mapping.MappedField;
import org.om.core.api.persistence.PersistenceAdapter;
import org.om.core.api.persistence.interceptor.PersistenceInterceptor;
import org.om.core.api.persistence.interceptor.handler.ItemHandler;
import org.om.core.api.persistence.interceptor.handler.ItemHandlerFactory;
import org.om.core.api.session.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Implementation of {@link PersistenceInterceptor}, takes care of calling the
* appropriate {@link ItemHandler}s and handles missing properties and default
* values via {@link MissingBehaviorPersistenceDelegateDecorator}.
*
* @author Jakob Külzer
*
*/
public class PersistenceInterceptorImpl implements PersistenceInterceptor {
private static final Logger LOGGER = LoggerFactory.getLogger(PersistenceInterceptorImpl.class);
private final PersistenceAdapter adapter;
private final ItemHandlerFactory handlerFactory;
private final Session session;
public PersistenceInterceptorImpl(Session session, ItemHandlerFactory handlerFactory, PersistenceAdapter adapter) {
this.session = session;
this.handlerFactory = handlerFactory;
this.adapter = adapter;
}
public Object get(MappedField mappedField) {
if (mappedField == null)
throw new IllegalArgumentException("MappedField is null");
final ItemHandler handler = handlerFactory.get(session, mappedField);
if (handler == null)
throw new ObjectMapperException("No handler for mapped field " + mappedField.getName() + " found.");
LOGGER.trace("Retrieving field {} with handler {}", mappedField.getName(), handler);
return handler.retrieve(mappedField, adapter);
}
}