package org.om.core.impl.persistence.interceptor.handler;
import java.util.List;
import java.util.Map;
import org.om.core.api.mapping.CollectionMapping;
import org.om.core.api.mapping.MappedField;
import org.om.core.api.mapping.field.IdMapping;
import org.om.core.api.mapping.field.Mapping;
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.om.core.impl.persistence.interceptor.handler.collection.PrimitiveListHandler;
import org.om.core.impl.persistence.interceptor.handler.collection.ReferenceListHandler;
import org.om.core.impl.persistence.interceptor.handler.map.PrimitiveMapHandler;
public class ItemHandlerFactoryImpl implements ItemHandlerFactory {
private static final IdHandler ID_HANDLER = new IdHandler();
public ItemHandler get(Session session, MappedField field) {
final Mapping mapping = field.getMapping();
if (mapping instanceof IdMapping) {
return ID_HANDLER;
}
if (mapping.isPrimitiveOrWrappedType())
return new PrimitiveHandler();
if (mapping instanceof CollectionMapping) {
final Class<?> fieldType = field.getType();
final Class<?> implementationType = mapping.getImplementationType();
final boolean primitive = mapping.isPrimitiveOrWrappedType() || String.class.equals(implementationType);
if (List.class.equals(fieldType)) {
if (primitive) {
return new PrimitiveListHandler(session);
} else {
return new ReferenceListHandler(session);
}
} else if (Map.class.equals(fieldType)) {
return new PrimitiveMapHandler();
}
throw new IllegalArgumentException("Don't know how to create ItemHandler for " + field);
}
return new ReferenceHandler(session);
}
}