package org.ovirt.engine.core.dao;
import java.io.Serializable;
import java.text.MessageFormat;
import org.ovirt.engine.core.common.businessentities.BusinessEntity;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
/**
* Implementation for the {@link GenericDao} 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 DefaultGenericDao<T extends BusinessEntity<ID>, ID extends Serializable>
extends DefaultReadDao<T, ID> implements GenericDao<T, ID> {
protected static final String DEFAULT_SAVE_PROCEDURE_FORMAT = "Insert{0}";
protected static final String DEFAULT_UPDATE_PROCEDURE_FORMAT = "Update{0}";
private static final String DEFAULT_REMOVE_PROCEDURE_FORMAT = "Delete{0}";
/**
* This is the name of the stored procedure used for {@link GenericDao#save(BusinessEntity)}.
*/
private String procedureNameForSave;
/**
* This is the name of the stored procedure used for {@link GenericDao#update(BusinessEntity)}.
*/
private String procedureNameForUpdate;
/**
* This is the name of the stored procedure used for {@link GenericDao#remove(Serializable)}.
*/
private String procedureNameForRemove;
/**
* 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>
* <li>For {@link GenericDao#save(BusinessEntity)}: {@link DefaultGenericDao#DEFAULT_SAVE_PROCEDURE_FORMAT}</li>
* <li>For {@link GenericDao#update(BusinessEntity)}:
* {@link DefaultGenericDao#DEFAULT_UPDATE_PROCEDURE_FORMAT}</li>
* <li>For {@link GenericDao#remove(Serializable)}:
* {@link DefaultGenericDao#DEFAULT_REMOVE_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 DefaultGenericDao(String entityStoredProcedureName) {
super(entityStoredProcedureName);
procedureNameForSave = MessageFormat.format(DEFAULT_SAVE_PROCEDURE_FORMAT, entityStoredProcedureName);
procedureNameForUpdate = MessageFormat.format(DEFAULT_UPDATE_PROCEDURE_FORMAT, entityStoredProcedureName);
procedureNameForRemove = MessageFormat.format(DEFAULT_REMOVE_PROCEDURE_FORMAT, entityStoredProcedureName);
}
protected final String getProcedureNameForUpdate() {
return procedureNameForUpdate;
}
protected void setProcedureNameForUpdate(String procedureNameForUpdate) {
this.procedureNameForUpdate = procedureNameForUpdate;
}
protected final String getProcedureNameForSave() {
return procedureNameForSave;
}
protected void setProcedureNameForSave(String procedureNameForSave) {
this.procedureNameForSave = procedureNameForSave;
}
protected final String getProcedureNameForRemove() {
return procedureNameForRemove;
}
protected void setProcedureNameForRemove(String procedureNameForRemove) {
this.procedureNameForRemove = procedureNameForRemove;
}
@Override
public void save(T entity) {
getCallsHandler().executeModification(getProcedureNameForSave(), createFullParametersMapper(entity));
}
@Override
public void update(T entity) {
update(entity, getProcedureNameForUpdate());
}
protected void update(T entity, String procedureName) {
getCallsHandler().executeModification(procedureName, createFullParametersMapper(entity));
}
@Override
public void remove(ID id) {
getCallsHandler().executeModification(getProcedureNameForRemove(), createIdParameterMapper(id));
}
/**
* Create a parameter mapper to map all entity fields to procedure parameters.
*
* @param entity
* The entity to map parameters for.
* @return The mapper for the parameters from the entity.
*/
protected abstract MapSqlParameterSource createFullParametersMapper(T entity);
}