package org.ovirt.engine.core.dao; import java.io.Serializable; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.async_tasks; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.LogCompat; import org.ovirt.engine.core.compat.LogFactoryCompat; import org.ovirt.engine.core.dal.dbbroker.CustomMapSqlParameterSource; import org.ovirt.engine.core.dal.dbbroker.DbEngineDialect; import org.ovirt.engine.core.utils.ReflectionUtils; import org.ovirt.engine.core.utils.serialization.json.JsonObjectDeserializer; import org.ovirt.engine.core.utils.serialization.json.JsonObjectSerializer; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.simple.ParameterizedRowMapper; /** * <code>AsyncTaskDAODbFacadeImpl</code> provides an implementation of {@link AsyncTaskDAO} using code refactored from * {@link DbFacade}. * * */ public class AsyncTaskDAODbFacadeImpl extends BaseDAODbFacade implements AsyncTaskDAO { private static LogCompat log = LogFactoryCompat .getLog(AsyncTaskDAODbFacadeImpl.class); private static class AsyncTaskRowMapper implements ParameterizedRowMapper<async_tasks> { @Override public async_tasks mapRow(ResultSet rs, int rowNum) throws SQLException { async_tasks entity = new async_tasks(); entity.setaction_type(VdcActionType.forValue(rs .getInt("action_type"))); entity.setresult(org.ovirt.engine.core.common.businessentities.AsyncTaskResultEnum .forValue(rs.getInt("result"))); entity.setstatus(org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum .forValue(rs.getInt("status"))); entity.settask_id(Guid.createGuidFromString(rs .getString("task_id"))); entity.setaction_parameters(deserializeParameters(rs.getString("action_parameters"),rs.getString("action_params_class"))); return entity; } @SuppressWarnings("unchecked") private VdcActionParametersBase deserializeParameters(String payload, String className) { if (className == null) { return null; } Class<Serializable> actionParamsClass = (Class<Serializable>)ReflectionUtils.getClassFor(className); return (VdcActionParametersBase)new JsonObjectDeserializer().deserialize(payload, actionParamsClass); } } private static class AsyncTaskParameterSource extends CustomMapSqlParameterSource { public AsyncTaskParameterSource(DbEngineDialect dialect,async_tasks task) { super(dialect); addValue("action_type", task.getaction_type()); addValue("result", task.getresult()); addValue("status", task.getstatus()); addValue("task_id", task.gettask_id()); addValue("action_parameters", serializeParameters(task.getaction_parameters())); addValue("action_params_class",task.getaction_parameters().getClass().getName()); } private String serializeParameters(VdcActionParametersBase params) { VdcActionParametersBase parentParams = params.getParentParameters(); params.setParentParemeters(null); String jsonStr = new JsonObjectSerializer().serialize(params); params.setParentParemeters(parentParams); return jsonStr; } } @Override public async_tasks get(Guid id) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("task_id", id); AsyncTaskRowMapper mapper = new AsyncTaskRowMapper(); return getCallsHandler().executeRead("Getasync_tasksBytask_id", mapper, parameterSource); } @SuppressWarnings("unchecked") @Override public List<async_tasks> getAll() { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource(); AsyncTaskRowMapper mapper = new AsyncTaskRowMapper(); return getCallsHandler().executeReadList("GetAllFromasync_tasks", mapper, parameterSource); } private AsyncTaskParameterSource getTaskParameterSource(async_tasks task) { return new AsyncTaskParameterSource(dialect,task); } @Override public void save(async_tasks task) { AsyncTaskParameterSource parameterSource = getTaskParameterSource(task); getCallsHandler().executeModification("Insertasync_tasks", parameterSource); } @Override public void update(async_tasks task) { logNullParameters(task); AsyncTaskParameterSource parameterSource = getTaskParameterSource(task); getCallsHandler().executeModification("Updateasync_tasks", parameterSource); } private void logNullParameters(async_tasks task) { if (task.getaction_parameters() == null) { StringBuilder sb = new StringBuilder("Null action_parameters:\n"); java.lang.StackTraceElement[] st = java.lang.Thread.currentThread() .getStackTrace(); for (int i = 0; i < st.length; i++) { sb.append(String.format("\tMethod: %1$s\n", st[i].getMethodName())); } log.error(sb.toString()); } } @Override public void remove(Guid id) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("task_id", id); getCallsHandler().executeModification("Deleteasync_tasks", parameterSource); } }