package org.ovirt.engine.core.dao; import java.io.Serializable; import java.text.MessageFormat; import java.util.List; import org.ovirt.engine.core.common.businessentities.BusinessEntity; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; /** * Implementation for the {@link ReadDao} which provides a default implementation for all the methods which only * requires extending classes to provide procedure names and relevant mapper classes. * * @param <T> * The type of entity. * @param <ID> * The type of the entity's id. */ public abstract class DefaultReadDao<T extends BusinessEntity<ID>, ID extends Serializable> extends BaseDao implements ReadDao<T, ID> { protected static final String DEFAULT_GET_PROCEDURE_FORMAT = "Get{0}By{0}Id"; protected static final String DEFAULT_GET_ALL_PROCEDURE_FORMAT = "GetAllFrom{0}s"; /** * This is the name of the stored procedure used for {@link GenericDao#get(Serializable)}. */ protected String procedureNameForGet; /** * This is the name of the stored procedure used for {@link GenericDao#getAll()}. */ protected String procedureNameForGetAll; /** * Initialize default procedure names with the given entity name.<br> * The default procedure names are determined by the following formats: * <ul> * <li>For {@link GenericDao#get(Serializable)}: {@link DefaultGenericDao#DEFAULT_GET_PROCEDURE_FORMAT}</li> * <li>For {@link GenericDao#getAll()}: {@link DefaultGenericDao#DEFAULT_GET_ALL_PROCEDURE_FORMAT}</li> * </ul> * * If you wish to use a procedure name different than the default one, please set it accordingly. * * @param entityStoredProcedureName * The name to use in the default procedure names templates. */ public DefaultReadDao(String entityStoredProcedureName) { procedureNameForGet = MessageFormat.format(DEFAULT_GET_PROCEDURE_FORMAT, entityStoredProcedureName); procedureNameForGetAll = MessageFormat.format(DEFAULT_GET_ALL_PROCEDURE_FORMAT, entityStoredProcedureName); } protected final String getProcedureNameForGet() { return procedureNameForGet; } protected void setProcedureNameForGet(String procedureNameForGet) { this.procedureNameForGet = procedureNameForGet; } protected final String getProcedureNameForGetAll() { return procedureNameForGetAll; } protected void setProcedureNameForGetAll(String procedureNameForGetAll) { this.procedureNameForGetAll = procedureNameForGetAll; } @Override public T get(ID id) { if (id == null) { return null; } else { return getCallsHandler().executeRead(getProcedureNameForGet(), createEntityRowMapper(), createIdParameterMapper(id)); } } @Override public List<T> getAll() { return getCallsHandler().executeReadList(getProcedureNameForGetAll(), createEntityRowMapper(), getCustomMapSqlParameterSource()); } /** * Create a parameter mapper to map the entity id to the id in the procedure parameters. * * @param id * The entity to map id for. * @return The mapper for the id from the entity. */ protected abstract MapSqlParameterSource createIdParameterMapper(ID id); /** * Create a row mapper to map results to the entity. * * @return A row mapper which can map results to an entity. */ protected abstract RowMapper<T> createEntityRowMapper(); }